【发布时间】:2012-06-11 08:25:44
【问题描述】:
在我们的项目中,我们在我们的 asp.net 应用程序中通过 COM 重用了很多 Delphi 代码。
像这样:遗留的delphi dll => delphi COM wrapper => .Net interop => asp.net (mvc)
我们在访问冲突、DLL 卸载等方面存在一些问题...我现在已经移植了一些以直接通过 P/Invoke 代码使用旧版 dll。
当我查看有关 COM 和 P/Invoke 的资源时,人们几乎总是建议使用 COM。这是为什么? P/Invoke 是否有以下好处:
- 签出的代码将始终使用正确的 dll 而不是最后注册的 COM
- 多个版本可以在服务器上并行运行(例如:DEV、TEST 和 QA)
- 没有更多的 COM 注册麻烦
- 比 COM 通信快得多(我阅读的文章表明速度提高了 30%)
【问题讨论】:
-
你能从 64 位进程 p/invoke 到 32 位 dll 吗?我不这么认为。
-
您能否提供一些建议 COM 优于 P/Invoke 的参考资料?我非常同意您的观点,即 P/Invoke 是可用的更好的解决方案。 .NET BCL 中的大部分内部都是根据对 Win32 API 的 P/Invoke 实现的。使用 COM 互操作的唯一原因是您别无选择,例如与 Office 应用程序或仅限 COM 的 Windows API 部分互操作。
-
还记得 DLL 地狱吗?您的代码将使用第一个可用的同名 dll,而不是使用正确的 dll。直到运行时才会检测到任何 API 更改,这意味着版本控制几乎是不可能的。如果不更改函数本身的名称,您无法创建一个同时为新旧客户端提供服务的 DLL
-
通过使用免注册 COM(也称为并行注册),您可以避免缺点列表中的第 2 项和第 3 项。好吧,第 3 项变成了如何让免注册 COM 做你想做的事。 msdn.microsoft.com/en-us/library/ms973913.aspx
-
我不喜欢 COM。它不是线程安全的,而且速度很慢,它需要管理员权限才能安装 COM 组件,而且它完全不能移植到其他操作系统。总而言之,我非常喜欢将我的 dll 编译为 x32 和 x64,并调用正确的,并提供完整的路径,这完全消除了 dll-hell。