【问题标题】:Unknown error when using .NET 4.0 with dll将 .NET 4.0 与 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 的值实际上是无关紧要的。你似乎在猜。

标签: c# c++ pinvoke dllimport


【解决方案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 组成的缓冲区长度值这一事实应该已经敲响了警钟!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2013-03-06
    • 2021-06-25
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多