【发布时间】:2010-04-02 21:17:47
【问题描述】:
delphi7如何访问C# .net managed dll?
我正在尝试访问一些用 c# 编译的 DLL,它们不是那些旧式 DLL。 (我没有这些 DLL 的源代码)
我确实尝试过在线搜索,但它们令人困惑。我想即使使用 D7 访问它也会有一些限制..
谢谢。
【问题讨论】:
-
C# .net 托管 dll 设置是否可以通过 com 访问?
delphi7如何访问C# .net managed dll?
我正在尝试访问一些用 c# 编译的 DLL,它们不是那些旧式 DLL。 (我没有这些 DLL 的源代码)
我确实尝试过在线搜索,但它们令人困惑。我想即使使用 D7 访问它也会有一些限制..
谢谢。
【问题讨论】:
@AngryHacker,对于您的建议,.NET 程序集需要用 ComVisibleAttribute 标记(启用注册 COM 互操作选项),并使用 [ComVisible(true)] 向 COM 公开每个函数。
如果您尝试使用第三方程序集(不是您编写的),您必须与供应商核实该程序集是否可以通过 COM 使用。
此外,程序集不需要强命名即可通过 COM 访问。
如果您不想采用 COM 方式,请查看 CrossTalk for Delphi : http://www.atozed.com/CrossTalk/Docs/index.EN.aspx
【讨论】:
Delphi7 以与任何其他基于 COM 的语言(例如 VB6)相同的方式访问托管 DLL。
基本的练习是这样的:
现在 Delphi7 应该能够像引用任何其他基于 COM 的 DLL 一样引用由 regasm 生成的 TLB 文件。
【讨论】:
您可以尝试使用"Inverse P/Invoke" trick 很久以前描述的Brian Long。
该技巧不需要 ComVisible(因此您应该能够在不更改 .NET 程序集源的情况下使用它)。
--杰罗恩
【讨论】:
这一点都不难。 如果您不想,您不必“重新充气”它。你甚至根本不需要注册任何 COM 式的东西。
最好用 C# 或其他托管语言创建包装器。 哦,确保你的课程是 ComVisible(true)。 这个 Stack Overflow 线程很好地总结了它,并附带了一组针对不同场景的示例。 Hosting CLR in Delphi with/without JCL - example
【讨论】:
如果您无法更改原始 DLL 的源,您可以使用 C# 或 Prism 编写一个代理,该代理公开一个您可以在项目中使用的 com 接口。这种方法的优点是您可以定制每个调用以仅使用您可以轻松处理的特定类型。
【讨论】: