将C API dll替换为C# DLL而不影响客户端

ktecyv1j  于 7个月前  发布在  C#
关注(0)|答案(2)|浏览(57)

我有一个CDLL,它是一个暴露许多方法的API。我想用一个更先进的语言编写的DLL来替换这个DLL。但是,我有客户已经集成到CDLL,我只想给予他们复制CDLL的新C# DLL。我需要以这样一种方式来做,即客户已经集成到CDLL根本不受影响。也就是说,我只是想用C#DLL替换CDLL,对他们来说应该是无缝的。
这在技术上可行吗?如果可行,我应该如何在C#中复制C接口。
我在CDLL中有一些方法是用dllexport定义的:

__declspec( dllexport ) void __stdcall

字符串

v09wglhw

v09wglhw1#

您必须为托管dll编写COM Package ,然后客户端代码必须链接COM Package 的类型库(*.tlb)。
你可以用C++/CLI来实现这一点,方法是构建一个混合模式的dll,将本机接口暴露给非托管代码。然后你只需像正常情况一样分发dll和.lib文件,客户端代码只需链接到.lib文件(就像现在一样)。
这是一个公平的工作位,虽然。除非有一些问题,原来的C动态链接库,我不认为我会去麻烦。

rm5edbpk

rm5edbpk2#

用“更先进的语言”替换用C语言编写的DLL是可能的。
你需要问自己的问题是:

  • 你有用C写的DLL的源代码吗?
  • 您是否有从DLL导出的C API的测试覆盖率?
  • 您是否有C API行为的文档记录?
  • 你有C API性能和内存消耗的详细信息吗?

如果你对这些问题的回答是“不”,那么我担心你将无法可靠地用另一种语言重新创建功能。
如果您确实具备了所有的预配置,那么这样做相对来说是微不足道的--唯一的成本是您花费在编写、文档编制和测试上的时间。
您可以使用UnmanagedExports NuGet包在.Net Framework中创建本地DLL导出以供其他语言使用。编写静态函数并在需要时使用[DllExport][MarshalAsAttribute]装饰它们就是您所需要做的。
这当然是假设你能熟练地使用C和C#,并且你对这两种语言的内存布局、堆栈、ABI、调用约定和数据库都有很好的理解。根据原始DLL的大小,这可能是微不足道的,也可能是巨大的,除了“使用最新语言”的温暖模糊感觉之外,几乎没有收获。并且实际上可能会降低性能,并为原始C DLL客户端引入不需要的(或者更糟的是,未满足的)依赖项。
因此,我最后的建议是“如果它没有坏,就不要修复它”,除非你想把它作为一种学习练习,在这种情况下,你应该从一个比其他人依赖的项目更不雄心勃勃的项目开始。

相关问题