C#dll调用不将char *传递给C ++ MFC常规dll

时间:2011-08-11 13:59:32

标签: c# pointers dll dllimport

我有一个C ++ MFC常规DLL,我正在调用以下内容:

public static class Access3rdPartyDLL
{
  public static string FilePath;
  [DllImport("3rdparty.dll")]  
  // I have also tried LPWStr
  public static extern long Download([MarshalAs(UnmanagedType.LPStr)]string sDownloadFile,
                                   int iDeviceNum
                                   ...);

  public static long DownloadToDevice()
  {
    long result;
    string FilePath = "C:\\myfile.txt"
    result = Download(FilePath, 1, ...);
    // check if success or error
    if(result > 0)
    ...
  }
}

我从DLL中收到一条错误,说“找不到文件:'C:\ myfile.txt'。但它的存在... 我也尝试过使用StringBuilder,但这也失败了。

这可能是DLL的问题还是我做错了什么? 我在这里找到了这个当前代码:SO: equivalent char* in C#

编辑:我之前在C ++中已经完成了这个并且这段代码有效:

extern "C" __declspec(dllimport) HRESULT __stdcall Download(char* sDownloadFile, int ...  

我打电话给:

HRESULT result = Download(file_for_download, 1, .. // where file_for_download is a char*

2 个答案:

答案 0 :(得分:0)

我没有看到任何理由为什么以下在这个简单的场景中不起作用:

[DllImport( "3rdparty.dll", CharSet = CharSet.Ansi )]
static extern long Download(string sDownloadFile, int iDeviceNum, ...)

long result = Download("C:\\myfile.txt", 1, ...);

答案 1 :(得分:0)

P / invoke唯一的问题是你使用64位的C#long,但HRESULT只有32位。

您有匹配的呼叫约定,托管string的默认编组在非托管端是char*

不匹配的返回值大小无法解释您的C#代码收到字符串消息File: 'C:\myfile.txt' not found的原因,因此您的主要问题很可能在于您未向我们展示的代码。