如何从C代码创建c#对象?

时间:2009-06-19 14:54:19

标签: c# c++ interop

我正在使用一个小型的C网络服务器。我正在使用C#库进行一些实际的请求处理。

我正在使用胶水层,它似乎是用接近c ++的东西编写的,以加入这两个世界。它提供了一个'公共参考类',我可以从C#世界中获得它。

如果我想在C#中从中派生出几个不同的类,如何从C / C ++创建这些派生类的实例?

什么信息(类名?工厂函数?)我从C#传递(以及以什么形式)到C / C ++代码?

我想要一个与.NET 2.0兼容的解决方案,我正在使用Visual Studio 2008来创建我的代码。

3 个答案:

答案 0 :(得分:2)

我已经多次意识到人们有时并不完全了解托管代码和非托管代码之间的区别,所以我只想总结一下:

  1. 您不能简单地从本机C ++应用程序调用托管代码。为了调用它,首先必须将.Net代码暴露给COM,然后在C ++中实例化COM对象。这样,您的本机应用程序认为它正在创建一个COM对象,而.Net正在运行时执行所有的互操作。

  2. 第二种方法是使用托管C ++ / CLI(它不是本机C ++,但支持两个世界)。这样,C ++和C#应用程序都可以进行管理,并且可以无缝通信。因此,只要使用托管C ++ / CLI编写“粘合层”,您就可以使用本机和托管数据。

  3. 正如您最初提到的非托管C ++,那么答案就是采用第一种解决方案:通过COM互操作将托管对象暴露给本地世界。如果您不介意使用托管C ++ / CLI,那么您可以使用更简单的解决方案 - 您可以轻松地实例化托管类(在语法上有一些变化,您应该很快习惯)。

答案 1 :(得分:1)

请参阅如何从Visual Studio.NET或Visual Studio 2005中的本机Visual C ++代码调用托管DLL

http://support.microsoft.com/kb/828736

答案 2 :(得分:1)

使用#using指令将C#程序集导入C ++代码。

#using "ThingLib.dll"
using namespace ThingLib;

如果您只希望C ++代码知道基类,则需要调用某种工厂方法。

ThingBase^ thing = myThingFactory.MakeThing(aParameter);

如果要在C ++中实际实例化派生类,请使用gcnew运算符。

ThingBase^ thing = gcnew DerivedThing(aParameter);

这里有一个很好的总结,用于与托管代码交谈的新C ++语言功能: http://msdn.microsoft.com/en-us/library/xey702bw.aspx