c code
extern "C" __declspec(dllexport) int export(LPCTSTR inputFile, string &msg)
{
msg = "haha"
}
c#code
[DllImport("libXmlEncDll.dll")]
public static extern int XmlDecrypt(StringBuilder inputFile, ref Stringbuilder newMsg)
}
当我尝试检索newMsg的内容时,我遇到了一个错误,说我正在尝试写入受保护的内存区域。
从c到c#检索字符串的最佳方法是什么。感谢。
答案 0 :(得分:4)
使用带有C ++类作为参数的导出的DLL即使在C ++中也是危险的。与C#互操作是不可能的。您不能使用相同的内存分配器,也无法调用构造函数和析构函数。更不用说您的C ++代码无效,它实际上不会返回字符串。
请改用C字符串。看起来像这样:
extern "C" __declspec(dllexport)
void __stdcall XmlDecrypt(const wchar_t* inputFile, wchar_t* msg, int msgLen)
{
wcscpy_s(msg, msgLen, L"haha");
}
[DllImport("libXmlEncDll.dll", CharSet = CharSet.Auto)]
public static extern void XmlDecrypt(string inputFile, StringBuilder msg, int msgLen)
...
StringBuilder msg = new StringBuilder(666);
XmlDecrypt(someFile, msg, msg.Capacity);
string decryptedText = msg.ToString();
这些代码段的一些注释:
答案 1 :(得分:0)
汉斯,
它很有效,非常感谢。顺便说一下,我在C#代码中发现了一个问题。 string inputFile只传递第一个字符。我通过编组进行了修改
[DllImport("libXmlEncDll.dll")]
public static extern void test(string file, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder msg, int msgLen);
再次,谢谢。