DELPHI 2009 中的 .NET 组件
Posted
技术标签:
【中文标题】DELPHI 2009 中的 .NET 组件【英文标题】:.NET component in DELPHI 2009 【发布时间】:2010-12-10 02:34:05 【问题描述】:能否告诉我.NET 组件是否可以与 Delphi 2009 一起使用,如果可以,请给我一些示例代码。
提前致谢。
【问题讨论】:
【参考方案1】:是的,可以在 win32 程序中使用 .net 组件。不幸的是,自己做起来并不简单,我强烈推荐Hydra。
【讨论】:
【参考方案2】:Win32 的 Delphi 中没有。
您可以为此使用 Delphi PRISM。
您也可以查看CrossTalk或Hydra
【讨论】:
【参考方案3】:有几种方法可以做到这一点,传统的 COM/Interop 只是其中一种方法。
另一种方法是使用 CLR 中内置的现有基础架构来支持 COM/Interop 和混合模式 C++/CLI。
CLR 非常支持编组与 IUnknown 之间的接口引用(并且每个 Delphi 接口都满足该要求) 您可以将 .Net 程序集转换为真正的 DLL 并使用任何语言导出函数 我编写了一个完全透明的 MSBuild 任务:http://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports 结合这两件事,您可以将 .Net 组件作为接口参考,而无需与 COM 和 clsids/progids 进行斗争你很幸运,我已经在另一个论坛上回答了一个非常相似的问题。所以我已经有了一些示例代码。 ;-)
我在这里展示的可能不是你的那杯茶。
它至少需要一些 .Net 知识,您可能不想过多地参与其中。 双方都需要手动步骤,即使您获得的灵活性很容易使其物有所值,但灵活性可能根本不是必需的。因此,经典 COM 可能是一种选择。归根结底,我自己不会使用经典 COM。除非它真的有意义。 (就像为 Office 编写 COM-Addins)
在 VisualStudio 中,您可以使用重构/提取接口向导从您的组件中获取具有您需要的方法的接口。
你需要提供这3个属性
[ComVisible(true)]
[Guid("Create a GUID yourself"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IYourInterface
“ComVisible”是必需的,否则 CLR 不会创建所需的运行时可调用包装器 (RCW)(将从 Delphi 中看到)
需要 GUID 来识别接口,在 Delphi 和 .Net 版本的接口中 GUID 必须相同
“ComInterfaceType.InterfaceIsIUnknown”告诉 CLR RCW 应该实现 IUnknown。
没有它,您将无法在 Delphi 中使用它。因为在 Delphi 中,每个接口都是 IUnknown。
为了简单起见,我假设你的组件只有一个简单的方法。 在 VisualStudio 中创建一个类库,然后按照其他页面中的步骤进行操作。 (为了能够导出函数)
[ComVisible(true)]
[Guid("Create a GUID yourself"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IYourInterface
void DoSomething(int value);
public class YourComponent : IYourInterface
public void DoSomething(int value)
return value + 1;
static class Exports
[DllExport("createyourcomponent")]
public static void CreateInstance([MarshalAs(UnmanagedType.Interface)]out IYourInterface instance)
instance = new YourComponent();
在 Delphi 中,您可以根据需要将此接口包装在组件中。 这将隐藏涉及 .Net 的事实:
type
IYourInterface = interface
['Create a GUID yourself']//Control+Shift+G in Delphi
// important, safecall is used by COM/Interop
procedure DoSomething(aValue : Integer); safecall;
end;
TYourComponent = class(TComponent)
private
fInnerInstance : IYourInterface;
public
procedure DoSomething(aValue : Integer);
constructor Create(aOwner : TComponent);
end;
implementation
procedure CreateManagedInstance(out aInstance : IYourInterface);
stdcall; external 'YourDotNetLibraryName'
name 'createyourcomponent';
constructor TYourComponent.Create(aOwner : TComponent);
begin
inherited Create(aOwner);
CreateManagedInstance(fInnerInstance);
end;
procedure TYourComponent.DoSomething(aValue : Integer);
begin
fInnerInstance.DoSomething(aValue);
end;
免责声明:我手边没有 IDE,因此示例代码中可能存在拼写错误或其他错误...
【讨论】:
【参考方案4】:您可以将 .NET 组件与作为 RAD 工作室的一部分的 Delphi for .NET 一起使用
【讨论】:
不再是,Delphi.NET 自 2009 年以来已被 Delphi Prism 取代。 Delphi for .NET 是 Rad Studio 2009 的一部分以上是关于DELPHI 2009 中的 .NET 组件的主要内容,如果未能解决你的问题,请参考以下文章
Delphi 2009 - 在自定义 Delphi 组件中设置默认属性值
如何在 Delphi 2010 ( UniSynEdit Package ) 中安装 Delphi 2009 组件包?