我有一个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*
答案 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
的原因,因此您的主要问题很可能在于您未向我们展示的代码。