其他分享
首页 > 其他分享> > 如何在基于C的dll或基于CLI的dll中包装C类?

如何在基于C的dll或基于CLI的dll中包装C类?

作者:互联网

我被告知要将我在C语言中的写入类导入到dll中,然后在c#应用程序中使用该dll.在this guide之后我创建了dll,但我不能简单地在C#应用程序中使用它,因为它有一些问题:

>我应该为工厂功能的返回类型放置什么?
> const wchar_t *是什么,它是我的构造函数参数类型?
>我如何检索和使用我的函数返回类型,其类型为vector< wstring的&GT ;?
这些问题阻止我在C#应用程序中使用我的C DLL.有人告诉我,我需要用C/C++LI创建一个包装器,然后在我的C#中使用它.但遗憾的是我不知道它,我不知道C .net.

目前似乎对我来说更耸人听闻的唯一一件事就是让它以某种方式与C兼容然后创建一个C DLL并在我的C#应用​​程序中使用它.我已经读过,在C语言中,类对象指针可以通过HANDLEs访问,所以我认为在不进行大量更改的情况下进行操作是个好主意.

所以问题是如何使用Handles访问C中的类对象并使用它们?我怎样才能转换矢量< wstring>它的C对应物?
如果我想使用CLI为我的C DLL创建一个包装器(DLL?),要在其他dotnet应用程序中使用,我该怎么办?

解决方法:

直接从C#使用本机C类在技术上是可行的,但它并非无足轻重,而且它甚至都不是一个好主意.对于初学者,您必须知道用于从DLL导入的名称,这将是C名称修改后的名称.您也无法直接访问C#中的vector等内容.

基本上有两个不错的选择:

第一种是使用C接口编写DLL,该接口仅使用可以编组为CLR类型的类型.您可以将指针与IntPtr类型一起使用,但是您无法真正取消引用这些指针.您几乎可以将它们存储在C#代码中,然后在需要时将它们传递回本机DLL.只要您不需要深层复制来处理它们,您也可以使用简单的结构类型.此选项涉及使用P / Invoke.

第二个选项是编写混合模式C/C++LI程序集,该程序集实现了访问本机代码所需的所有逻辑.这个程序集可以直接访问C#代码中的类和数据,也可以直接访问您的本机代码,尽管您应该预先警告,有些烦人的中断,你不能混合这两个.例如,C/C++LI中的ref类不能具有shared_ptr成员.但是,它可以将原始C指针作为成员. (混合模式)本机类也可以访问CLR句柄类型,并通过它调用C#代码.此选项涉及使用C Interop.

值得注意的是,您也可以使用C Interop的另一种方式.您可以让C#代码访问混合模式C/C++LI程序集,该程序集为某些本机代码提供.NET接口.但是,在这种情况下,您仍然需要进行一些翻译,因此它并不比第一个选项好很多.

关于C语言的完整教程将是相当冗长的.我建议你阅读here并对Google上的C Interop做进一步调查.

标签:c-3,c,dll,c-cli
来源: https://codeday.me/bug/20190831/1777478.html