仍在研究从这里开始的问题 从C#调用C++ DLL函数:结构,字符串和wchar_t数组.,但采用不同的方法.
按照从非托管代码调用托管代码的示例,反之亦然,我在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 Interop Assitant.它将为大多数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来完成工作.