将 .NET 4.0 与 dll 一起使用时出现未知错误

Posted

技术标签:

【中文标题】将 .NET 4.0 与 dll 一起使用时出现未知错误【英文标题】:Unknown error when using .NET 4.0 with dll 【发布时间】:2015-11-05 09:15:17 【问题描述】:

c++代码是

MSIPC_SDK LONG __stdcall Ms_IpcClient_CaptureImage(LONG nUserId, char *sFilePath, 
    int nPathLen, const char *sDiskPath = NULL);//sDiskPath example: "C: \\".

影响:拍摄快照

参数备注:

LONG nUserId: Ms_Ipc_Login()//登录成功后返回值 char *sFilePath: //录音文件保存目的地 int nPathLen: //路径长度 const char *sDiskPath = NULL: //要保存哪个磁盘

我的 C# 代码是:

[DllImport("MsIpcSDK", CharSet = CharSet.Ansi, 
    CallingConvention = CallingConvention.StdCall)]
public static extern int Ms_IpcClient_CaptureImage(
    int lUserID, 
    [MarshalAs(UnmanagedType.LPStr)]
    string sFilePath, 
    int nPathLen,
    [MarshalAs(UnmanagedType.LPStr)]
    string sDiskPath
);

并使用is方法:

var ret = Ms_IpcClient_CaptureImage(loginID, "C:\\a.bmp", 10000, "C:\\");

它在 .Net Framework 2 中工作,但在 .Net Framework 4 中不起作用。 如何在 .Net Framework 4 中修复它?

【问题讨论】:

定义“不工作”。什么不起作用?你得到一个编译错误?什么样的错误? 在.net 4中使用方法时显示停止工作(问题导致程序停止正常工作)并关闭程序 您是否尝试调试您的程序以查看它到底在哪里失败?您是否确保将参数正确传递给函数? LoginID 有效吗?你试过@"C:\a.tmp"而不是"C:\\a.tmp"吗?你试过用CharSet = CharSet.Default吗? @LightBulb @"C:\a.tmp" == "C:\\a.tmp"CharSet = CharSet.Default 在 Windows 上等价于CharSet.Ansi,并且在任何情况下每个文本参数都有MarshalAs(UnmanagedType.LPStr),所以CharSet 的值实际上是无关紧要的。你似乎在猜。 【参考方案1】:

sFilePath 用于将字符串从被调用者传递给调用者。这就是为什么类型是char* 而不是const char*,这就是为什么有一个缓冲区长度参数。这意味着您需要使用StringBuilder 而不是string。 p/invoke 应该是:

[DllImport("MsIpcSDK", CharSet = CharSet.Ansi, 
    CallingConvention = CallingConvention.StdCall)]
public static extern int Ms_IpcClient_CaptureImage(
    int lUserID, 
    StringBuilder sFilePath, 
    int nPathLen,
    string sDiskPath
);

调用应该是:

var filePath = new StringBuilder(260);
var ret = Ms_IpcClient_CaptureImage(loginID, filePath, filePath.Capacity, "C:\\");

您的代码一直是错误的,直到现在您才算成功。您传递了一个由10000 组成的缓冲区长度值这一事实应该已经敲响了警钟!

【讨论】:

以上是关于将 .NET 4.0 与 dll 一起使用时出现未知错误的主要内容,如果未能解决你的问题,请参考以下文章

安装.Net Framework 4.8 时出现未安装成功

尝试在 if 语句中检查 json 响应时出现未捕获(承诺)错误

Angular2:尝试使用 @ViewChild 注释将焦点设置到输入字段时出现未定义的错误

将 Core Data 添加到现有 Xcode 项目时出现未声明的标识符错误

将材质应用于 gltf 对象时出现未定义错误

Java - 在 for 循环中使用“继续”时出现未处理的异常错误?