PInvoke с CString - PullRequest
       47

PInvoke с CString

0 голосов
/ 01 октября 2011

Я пытаюсь использовать P / Invoke для вызова функций в неуправляемой C ++ DLL из C #.C ++ DLL использует CString в качестве параметров функции и возвращает, например,

CString AFX_EXT_API GetUserName(CString& userID)

К сожалению, C ++ является устаревшим кодом, который я не могу изменить, чтобы использовать более универсальный LPSTR (или даже * 1006).*).

Есть ли способ упорядочить CString в .NET-совместимый объект?Или как-то украсить .NET char[] для маршалинга в CString?

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Вы не можете создать CString в управляемом коде. Очевидно, что вам нужен дополнительный слой между управляемым кодом и собственным кодом.

Это дает вам возможность создать C ++ / CLI DLL, которая находится между ними. Вы можете вызвать этот код из вашей управляемой сборки без необходимости P / invoke. А из среднего уровня C ++ / CLI вы можете создать CString.

Однако есть одна оговорка. Вы должны использовать ту же среду выполнения C ++, что и нативную DLL. Это может быть возможно, но вполне вероятно, что это будет камнем преткновения. Например, если DLL была написана с использованием MSVC6, то вам также потребуется создать промежуточный уровень с MSVC6, что исключает использование C ++ / CLI. Вернуться к P / invoke и char* в этом случае.

Я бы подчеркнул, что это ужасная практика - экспортировать интерфейс DLL на основе CString, и я буду искать альтернативы DLL.

1 голос
/ 01 октября 2011

Если вы не можете изменить саму DLL, очевидным выбором является написание прокси-DLL, которая будет принимать char [], выделять CString и затем вызывать DLL.

...