Я написал оболочку C ++ / CLI для C ++ - DLL, чтобы использовать эту DLL в программе на C #.
Однако, когда я вызываю функцию, которая принимает символ *, я получаю AccessViolation
int Wrapper::Net_methodX(int a, String^ key, long v)
{
IntPtr ptr = Marshal::StringToHGlobalAnsi(key);
pin_ptr<char> cKey = static_cast<char*>(ptr.ToPointer());
int val = methodX(a,cKey, v); // AccessViolation here
Marshal::FreeHGlobal(ptr);
return val;
}
Подпись функции C ++:
int methodX(int a, char *Key, long v);
РЕДАКТИРОВАТЬ 1
Просто «закрепить», как показано ниже, неработать либо:
int Wrapper::Net_methodX(int a, String^ key, long v)
{
IntPtr ptr = Marshal::StringToHGlobalAnsi(key);
char* cKey = static_cast<char*>(ptr.ToPointer());
pin_ptr<char> pinned = cKey;
int val = methodX(a,cKey, v);
Marshal::FreeHGlobal(ptr);
return val;
}
РЕДАКТИРОВАТЬ 1 КОНЕЦ
РЕДАКТИРОВАТЬ 2
Я также пытался PtrToStringChars следующим образом (СпасибоМэтт, нашел также некоторые документы здесь ):
int Wrapper::Net_methodX(int a, String^ key, long v)
{
pin_ptr<const wchar_t> wkey = PtrToStringChars(key);
size_t convertedChars = 0;
size_t sizeInBytes = ((key->Length + 1) * 2);
errno_t err = 0;
char * ckey = (char * ) malloc(sizeInBytes);
err = wcstombs_s(&convertedChars, ckey, sizeInBytes, wkey, sizeInBytes);
int val = methodX(A_Symbol_Table,ckey, Value);
return val;
}
AccessViolation по-прежнему происходит, возможно, это ошибка в methodX () (который является сторонней DLL).
РЕДАКТИРОВАТЬ 2 КОНЕЦ
Я прочитал здесь несколько связанных вопросов, но пока не нашел решения.
Есть какие-нибудь подсказки?Спасибо.