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 2009 - 检测是不是安装了组件

如何在 Delphi 2010 ( UniSynEdit Package ) 中安装 Delphi 2009 组件包?

Delphi 2009:传递组件名称 onclick 事件然后设置属性

如何在 Delphi 2009 中对自定义组件进行鼠标平移

Delphi 组件保存