仍在解决从这里开始的问题从 C# 调用 C++ dll 函数:结构体、字符串和 wchar_t 数组。 https://stackoverflow.com/questions/680066/calling-c-dll-function-from-c-of-structs-strings-and-wchart-arrays,但采用不同的方法。
遵循示例从非托管代码调用托管代码,反之亦然 http://www.codeproject.com/KB/mcpp/unmanaged_to_managed.aspx我用 C++ 编写了一个托管包装器来访问非托管 C++ dll 中的 unmanages 类。
它看起来像这样:
//in header file
public __gc class TSSLDllWrapper
{
public:
TSSLDllWrapper();
//this is the unmanaged class
CcnOCRsdk * _sdk;
bool convertHKID_Name(char *code, RECO_DATA *o_data);
};
//in .cpp file
TSSLDllWrapper::TSSLDllWrapper(void)
{
_sdk = new CcnOCRsdk();
}
bool TSSLDllWrapper::convertHKID_Name(char *code, RECO_DATA *o_data)
{
return _sdk->convertHKID_Name(code, o_data);
}
//C++ RECO_DATA structure definition:
struct RECO_DATA{
wchar_t FirstName[200];
wchar_t Surname[200];
};
现在我有了一个可以导入到我的 C# 项目中的 dll。
然而问题是:
当我想从dll文件中调用方法时,如下所示:
TSSLDllWrapper wrapper = new TSSLDllWrapper();
bool res = wrapper.convertHKID_NameSimple( //need to pass parameters here );
它需要 C++ 参数 - 指向 char 和 RECO_DATA 的指针。
如何解决此问题并从 C# 代码传递 C++ 类型?
转换大多数 C 数据类型的一种方法是使用PInvoke 互操作助手 http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120。它将为大多数 C 结构创建正确的 C# / VB.Net 类型。这是 RECO_DATA 的输出
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
public struct RECO_DATA {
/// wchar_t[200]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=200)]
public string FirstName;
/// wchar_t[200]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=200)]
public string Surname;
}
对于 char* 参数,您可以传递 IntPtr.Zero 或使用 Marshal.StringToCoTaskMemAnsi 来完成工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)