我有一个用C++编写的dll,我想从C#中调用它。该函数输出outputChar和deadChar,C++函数也会读取deadChar变量。
我试图以不同的方式从C#调用函数,但始终遇到AccessViolationException:“试图读取或写入 protected 内存。这通常表明其他内存已损坏。”
C++ dll:
extern "C" _declspec (dllexport) int convertVirtualKeyToWChar(int virtualKey, PWCHAR outputChar, PWCHAR deadChar);
C#代码1:
[DllImport("keylib.dll")]
static extern int convertVirtualKeyToWChar(int virtualKey,
StringBuilder output,
StringBuilder deadchar);
C#代码2:
static extern int convertVirtualKeyToWChar(int virtualKey,
out char output,
ref char deadchar);
最佳答案
注意:函数PWCHAR
的两个convertVirtualKeyToWChar
参数是不明确的。它们可以是指向单个WCHAR
的指针,也可以是指向WCHAR
字符串的指针。给定函数和参数的名称,此答案假定它们是指向单个WCHAR
的指针。
您要使用以下内容:
您的崩溃是由两个原因引起的:DllImport
默认为ANSI字符集和StdCall调用约定。您的C++ DLL没有指定任何调用约定,因此它将默认为CDecl。
参见DllImportAttribute.CallingConvention和DllImportAttribute.CharSet
关于c# - 如何从C#将PWCHAR传递到C++ dll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5526570/