YKK Reddy Ответов: 1

Несколько вопросов о совместимости-экспортированные функции C++ для использования в C#


Всем Привет,

У меня есть код, написанный на C++, который мне нужно использовать в приложении C#.
Ниже приведен синтаксис двух методов, которые мне нужно использовать в моем приложении C# :
long __declspec (dllimport) MyMethod1(const wchar_t* inputFileName, const wchar_t* outputFileName)

__declspec (dllimport) int __stdcall MyMethod2(void ** pMyVoidPtr, MY_CUSTOM_STRUCT* pMyCustomStruct);

Я мог бы использовать их в своем приложении C++, как показано ниже:
MyMethod1(_T("C:\\InputFile.txt"), _T("C:\\OutputFile.txt"));

MY_CUSTOM_STRUCT myCustomStruct;

void* pVoidPtr = NULL;

MyMethod2(&pVoidPtr, &myCustomStruct);

В приложении C++ я мог бы получить желаемые результаты. Но в приложении C# указатель pVoidPtr всегда возвращает NULL.

Я пробовал использовать ref, out IntPtr в качестве параметров, но все потерпело неудачу.

Может ли кто-нибудь предоставить мне синтаксис для одного и того же приложения в C# (для обоих методов)?

Спасибо и с уважением,
Кишор Редди

Что я уже пробовал:

[DllImport("Exported Dll Path")]
long static extern MyMethod1(string strInputName, string strOutputName);

[DllImport("Exported Dll Path")]
int static extern MyMethod2(out IntPtr pVoidPtr, MY_CUSTOM_STRUCT myCustomStruct);

[DllImport("Exported Dll Path")]
int static extern MyMethod2(out IntPtr pVoidPtr, IntPtr myCustomStruct);

Garth J Lancaster

ладно...

почему вы используете DllImport на стороне c++? т. е. "long _ _ declspec (dllimport)" разве вы не должны экспортировать эти функции ?

Я бы также посмотрел на дискуссию о "структурах данных" между Дэвидом и люком в этой статье как на ответ на "то же самое" о маршалинговых структурах https://www.codeproject.com/Articles/138614/Advanced-Topics-in-PInvoke-String-Marshaling

. и, может быть, эта статья, так как Дэвид упоминает об этом http://www.developerfusion.com/article/84519/mastering-structs-in-c/

1 Ответов

Рейтинг:
10

KarstenK

Сначала Гарт прав ты должен экспорт функции доступа к ним извне.

И вы не должен импортируйте память или выделенный objext из одной среды выполнения (C++) в другую (C#). Тебе не понравятся ловушки. Предоставьте достаточно большой буфер из C#, возможно, после запроса C++ с явной функцией, а затем выделите и выполните вызов.

Прочитай моя статья для какого-то простого способа решить эту проблему. В конце также находится ссылка, где обрабатывается более сложный сценарий.