将 .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 一起使用时出现未知错误的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 if 语句中检查 json 响应时出现未捕获(承诺)错误
Angular2:尝试使用 @ViewChild 注释将焦点设置到输入字段时出现未定义的错误