在C中编写.NET对象?

时间:2009-10-01 09:50:44

标签: .net c interop mono

有没有办法在C / C ++中编写可以在.NET中使用的对象?我想以一种最简单的方式来做,一个用于扩展基本上所有其他语言的方法,即在C语言中编写一个对象,符合语言运行时所需的接口,使用语言中的对象。

7 个答案:

答案 0 :(得分:3)

如果使用托管C ++,则编译为IL代码,因此可以直接在任何.NET语言中使用。

对于非托管C / C ++代码,您需要在.NET代码中使用P / Invoke来调用它。

答案 1 :(得分:1)

如果P / Invoke或C ++ / CLI不适合您的任务,您可以在.NET中使用COM支持。

以下是一个示例:

C++ part

C# part

它适用于MS.NET和Mono

答案 2 :(得分:0)

您可以使用C / C ++制作库并导出方法,并使用P/Invoke在.NET中使用它。

答案 3 :(得分:0)

您需要使用C ++ / CLI(以前称为托管C ++,但我认为该术语被微软的营销人员弃用)。

C ++ / CLI是一个C ++超集,它编译为.NET IL并提供允许与其他.NET语言互操作的功能。

C ++ / CLI允许混合托管代码和本机代码。它是唯一支持该语言的.NET语言。

答案 4 :(得分:0)

两种方式:

<强> C ++ / CLI: C ++ / CLI是一种使事物可以桥接的方法。您在C ++ / CLI中为CLI创建的类不是完全常规的旧C ++类,但您可以使用适配器模式桥接C ++类(注意那些SEHExceptions!)

<强> P /调用: 如果要使用基本的本机C / C ++库进行开发,可以使用P/Invoke从CLR访问任何标准C导出,如果在两侧声明它们,则可以手动对象进行操作。有关您可能想知道的更多信息,请参阅“Interop with Native Libraries”指南。

我不能强调它。留意你的例外!不要让它们从您的CLI代码转移到您的本机代码或从您的本机代码转移到它们的CLI代码中。

答案 5 :(得分:0)

如果您正在使用unmanaged types (ECMA-334 §27.2),例如基本类型数组,您可以执行以下操作。由于这会牺牲相当多的代码安全性,我强烈建议首先尝试替代方案,并且只有在P / Invoke证明调试器外部的发布版本缓慢时才会使用它(调试器使用much slower P/Invoke (100x slower)来捕获几种类型的故障)。

[DllImport("NativeLibrary.dll")]
private extern unsafe void NativeMethod(byte* data, int length);

byte[] data = new byte[10000000];
unsafe
{
    fixed (byte* ptr = data)
    {
        NativeMethod(ptr, data.Length);
    }
}

答案 6 :(得分:0)

遗憾的是,

Mono cannot currently compile C++/CLI,所以虽然C ++ / CLI可能是最有效和直接的方式来做你所要求的,但它可能不适合你。您可以使用.NET工具编译C ++ / CLI程序集,或许but even that may not work(向下滚动到“我可以执行我的Visual Studio .NET程序......”的答案)。

P / Invoke或COM互操作应该这样做,虽然P / Invoke带有潜在的性能问题,COM互操作意味着你需要将以前简单的vanilla C接口转换为COM接口...在C中,不是那么愉快。