Я использую стороннюю проприетарную DLL, исходный код которой мне не доступен.Однако код оболочки, который был сгенерирован автоматически с помощью SWIG 1.3.39, доступен для меня.Код оболочки состоит из файла C ++, который компилируется (с использованием некоторых заголовков, описывающих DLL) в DLL, и проекта C #, который делает вызовы PInvoke к DLL-оболочке C ++.
Согласно моей интерпретации документации поставщикаЯ скомпилировал все в решении как x86 или x64, в зависимости от целевой платформы.Поставщик предоставляет как 32-битные, так и 64-битные версии проприетарной DLL, и я гарантировал, что использую правильную версию для данной сборки.Моя машина 32-битная.Тестирование x86-версии моего приложения на моей машине, в релизной или отладочной сборках, похоже, работает нормальноОднако в 64-разрядной версии приложение работает в режиме отладки, но в System.AccessViolationException в режиме выпуска происходит сбой.
Я прочитал эту прекрасную запись в блоге , которая, по-видимому, описывает отладку иХорошо отпустите проблему, а также этот вопрос и ответ , которые привели к публикации в блогеОднако я не уверен, как устранить проблему в этом случае.
Кажется, что AccessViolationException возникает при первом возврате (или попытке возврата) строки любой реальной длины из оболочки C ++.Вот код C #, вызывающий проблемы:
// In one file of the C# wrapper:
public string GetKey()
{
// swigCPtr is a HandleRef to an object already created
string ret = csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);
return ret;
}
// In the csWrapperPINVOKE class in another file in the C# wrapper:
[DllImport("csWrapper.dll", EntryPoint="CSharp_mdMUHybrid_GetKey")]
public static extern StringBuilder mdMUHybrid_GetKey(HandleRef jarg1);
И код C ++ из обертки C ++:
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
char *result = 0 ;
arg1 = (mdMUHybrid *)jarg1;
result = (char *)(arg1)->GetKey();
jresult = SWIG_csharp_string_callback((const char *)result);
return jresult;
}
SWIGEXPORT
уже был определен как __declspec(dllexport)
.При отладке я обнаружил, что SWIG_csharp_string_callback
, определенный как:
/* Callback for returning strings to C# without leaking memory */
typedef char * (SWIGSTDCALL* SWIG_CSharpStringHelperCallback)(const char *);
static SWIG_CSharpStringHelperCallback SWIG_csharp_string_callback = NULL;
, был задан делегату (в оболочке C #):
static string CreateString(string cString) {
return cString;
}
Я пытался возиться с этимкод для использования таких конструкций, как Marshal.PtrToStringAut
безрезультатно.Как устранить неполадки и / или устранить эту проблему?