当前位置:  开发笔记 > 编程语言 > 正文

将C#数据类型参数传递给用C++编写的dll?

如何解决《将C#数据类型参数传递给用C++编写的dll?》经验,为你挑选了1个好方法。

仍在研究从这里开始的问题 从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++类型?



1> JaredPar..:

转换大多数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来完成工作.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有