【发布时间】:2018-11-07 21:37:59
【问题描述】:
我有一个 64 位的 C++ dll,其中包含一个返回 LPStr 的函数。我想在 C# 中调用这个函数。函数声明如下所示:
__declspec(dllexport) LPSTR __stdcall function(int16_t error_code);
在我的 C# 代码中,我尝试了以下方法:
[DllImport(@"<PathToInterface.dll>", EntryPoint = "function")]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string function(Int16 error_code);
然后在程序中:
string ErrorMessage = "";
ErrorMessage = function(-10210);
我知道函数本身很好,因为我可以从另一个程序(用 LabVIEW FWIW 编写)调用它。但是当我执行 C# 程序时,它只是以错误代码0x80000003 退出,我什至无法尝试,捕获异常。
如何正确调用这个函数?
作为一个侧节点:我在这个 dll 中确实有其他函数,它们使用 LPStr 作为参数,我可以毫无问题地调用它们。只有两个函数返回 LPStr 会产生问题
【问题讨论】:
-
function是如何实现的?最重要的是如何分配返回值 -
我读到您需要使用 extern "C" 块定义导出,如下所示: extern "C" __declspec(dllexport) int captureCamera(int& captureId) { ... }
-
0x80000003 是 E_INVALIDARG。现在,我显然不知道哪个 DLL 函数执行的本机代码导致了错误;但首先要验证您调用的函数是否真正“理解”值
-10210(即,该特定值是否存在相应的错误消息/文本字符串?)