DELPHI 2009中的.NET组件

时间:2009-10-26 11:33:55

标签: .net delphi components delphi-2009

你能告诉我.NET组件是否可以与Delphi 2009一起使用,如果有的话,请你给我发一些示例代码。

提前致谢。

4 个答案:

答案 0 :(得分:6)

在Win32中不在delphi中。

您可以使用Delphi PRISM。

您还可以查看CrossTalkHydra

答案 1 :(得分:3)

是的,可以在win32程序中使用.net组件。不幸的消息是,做自己并不是很简单,我强烈推荐Hydra

答案 2 :(得分: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。除非它真的有意义。 (就像为办公室编写COM-Addins一样)

在VisualStudio中,您可以使用重构/提取界面向导从组件中获取具有所需方法的界面。

您需要提供这3个属性

[ComVisible(true)] 
[Guid("Create a GUID yourself"), 
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IYourInterface
  • “ComVisible”是必需的,或者CLR不会创建所需的运行时可调用包装器(RCW)(将从Delphi中看到的东西)
  • 需要GUID来识别接口,GUID必须与接口的Delphi和.Net版本相同
  • “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方便,因此示例代码中可能存在拼写错误或其他错误...

答案 3 :(得分:1)

您可以将.NET组件与Delphi for .NET一起使用,这是RAD工作室的一部分