#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 #.