如何共享类与C#在Visual C ++ DLL?(How to share a class in

2019-09-28 02:42发布

我在C ++写了一个程序,它输出作为一个DLL。 我有一个C#WPF GUI和我想要导入的DLL做处理。

我是很新的C#。 如何使用C#中的C ++类? 我知道我不能只使用.h文件。

因为我在C ++中使用的指针,在C#中我不能使用指针。 这就是为什么我弄糊涂了。 像C ++我用char* ,而不是string ,我需要回到double*为大集合double数据,以及诸如此类的东西。

Answer 1:

有多种方式:

  1. 导出的DLL函数 ,并使用DllImportAttribute到的P / Invoke到DLL。
  2. 如果它是一个COM DLL,那么你就可以生成一个运行时可调用包装通过TLBIMP.EXE
  3. 您可以使用C ++ / CLI建立创建.NET程序集加载并调用该DLL方法本身。

为了解决您的其他问题,是的,你可以在C#中使用指针。 如果你有其中有一个功能double*参数,你可以声明,在C#这样的:

[DllImport("Your.DLL")]
private static extern unsafe void DoProcessing(double* data, int dataSize);

你需要确保你检查C#项目的生成选项卡上的“允许不安全代码”复选框,并在这之后,你可以使用指针到你的心脏的内容。

但是,请注意,虽然我在这里提供的指针签名,因为你是一个指针明显舒服,还有其他的签名可能是更为安全供您使用,并且不会要求您编译C#与不安全的代码。 在CLR标准编组会照顾的转换从一个指针到C#阵列,提供你给它一个位的提示的,如果需要的长度:

[DllImport("Your.DLL")]
private static extern void DoProcessing(
        [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double[] data, 
        int dataSize);

这指示使用在索引1处的参数(第2参数)作为双打的数组的大小指向由第一参数编组。 这可以让你避免在C#中的指针,并使用安全的CLI类型。 但是,如果你喜欢的指针,我的建议是只使用它们 - C#会为你更容易不必弄清楚如何不写他们的方法签名。

有关的P / Invoke的详细信息,请参阅本文档: http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx



Answer 2:

这在很大程度上取决于你的C ++ DLL的结构。 如果你只是一个功能屈指可数,而他们是一类没有成员函数,那么你可以让他们“外部C”的功能和使用的P / Invoke能力在.NET(有时也被称为的DllImport因为属性的使用)从C#访问的功能。



文章来源: How to share a class in a Visual C++ DLL with C#?