Как использовать класс, определенный в c # dll из кода c

#c# #c #dll

#c# #c #dll

Вопрос:

У меня есть dll, которая была написана на c #, и я использовал эту DLL в своем коде на c (именно MFC). Я могу использовать функцию dll с возвращаемым значением int, string… Но мне нужно использовать функцию с возвращаемым значением c # class! Я не знаю, какой тип данных в MFC для ввода возвращаемого значения функции в c # dll. c # объект возвращаемого значения преобразуется в _variant_t в MFC . Пожалуйста, помогите мне. Спасибо, что прочитали мой вопрос

C # code (аннотация)

 [Guid(" - - - - ")]
public interface ITestClass
{
     object Func();
}

[Guid(" - - - - ")]
public class TestClass : ITestClass
{
   public object Func()
   {
       Project1.Class1 data = dataList[0];
       return data ;
   }
}
  

Код MFC (аннотация)

 ITestClass *ptc = NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_TestClass, NULL, CLSCTX_INPROC_SERVER, IID_ITestClass, reinterpret_cast<void**>(amp;ptc));

int sum = ptc->Sum(5, 30); // It is perfect

data = ptc->Func(); // I don't know what data type is

  

Ответ №1:

у вас должен быть такой же класс, определенный в C . Это довольно сложно и может давать ошибки. Поэтому я бы попробовал с CLI.

Или есть более простой способ. Не делайте этого 🙂 Кроме того, используйте старый, хороший механизм, такой как:

 int objectHandle = ptc->CreateObject();
int data = ptc->GetSomeIntData(objectHandle);
ptc->DoSomeOperation(objectHandle);
ptc->ReleaseObject(objectHandle);
  

Идея в том, что у вас нет класса на стороне C . Объект создается на стороне C # и имеет свой уникальный дескриптор объекта (это может быть хэш-код). Вы возвращаете этот дескриптор в CreateObject, а на стороне C # вы можете сохранить свой объект в словаре:

 Dictionary<int, MyClass>
  

Затем на стороне C вы вызываете функции с помощью вашего objectHandle.

Это гораздо более простой способ добиться того же результата.

Но если вы действительно хотите использовать этот класс, вы можете попробовать следующее: — убедитесь, что ваша библиотека C # совместима с com (зарегистрируйте опцию COM interop) — После компиляции библиотеки C # должен быть файл tlb. Импортируйте его в c :

 #import "pathtolib.tlb"
  

далее вы можете использовать его следующим образом:

 CoInitialize(NULL);
ClassNamespace::ITestClassPtr myClass(__uuidof(ClassNamespace::TestClass));
myClass->Func();
CoUninitialize();
  

Вы также можете перенести всю эту функциональность в класс C . Это, конечно, создает больше работы и заставляет вас хранить два похожих кода (реальный класс и класс-оболочку). Но может быть более удобным в использовании.

Если вы хотите вернуть другой класс, вам придется сделать это аналогичным образом. Создайте com-интерфейс, используйте его на c и верните его на c #.