用于本机C ++和.NET的Windows DLL是否相同?

时间:2019-01-07 17:23:51

标签: c# .net

  

用于本机C ++和.NET的Windows DLL是否相同?

在MSDN上浏览.NET文档时,有时会看到对用于本机Windows C ++编程的常见DLL的引用。

我想知道是否有DLL的特殊版本,例如user32.dll,用于.NET编程,还是CLR是否直接调用标准的本机C ++ DLL?

1 个答案:

答案 0 :(得分:0)

可以可以。如果C ++ DLL以正确的方式公开内容,则.NET可以直接使用它。即使不是,大多数DLL函数也可以使用称为P / Invoke的方法(一种做事方法,而不是C#方法)从C#调用。 P / Invoke在C#代码中需要一些特殊的粘合声明,以描述C#编译器的功能(普通DLL没有这种类型的元数据),以便它知道如何处理从DLL函数发送和接收的数据。

.NET使用托管内存和垃圾回收,这意味着可以通过遍历所有正在使用的对象的图来扫描程序使用的所有内存。除非经过专门编写以使用.NET,否则C ++(通常是DLL)不会执行此操作。尽管C ++通常使用对象,但不一定如此。在C ++中,可以分配原始内存,并且C ++运行时将看不到任何可能放入该内存的指针。这种类型的数据确实会与.NET运行时混淆,因为它无法知道可以释放哪些内存以及哪些内存超出了限制。另一方面,.NET运行时可以“查看”内存中的所有对象,但是可以在需要时随时移动它们,并根据需要更新指针(这实际上会使C ++崩溃)。结果,.NET程序调用非托管DLL函数时,必须将传入和传出的数据从一种内存模型转换为另一种内存模型。