2009-08-07 82 views
0

这就是我正在做的:我目前需要在delphi中打开和使用.NET程序集。我试图使用的程序集也具有它正在使用的对象的程序集。我能够使用regasm为主组件创建一个类型库。我也能够分配一个SN并在GAC中注册。在Delphi中没有显示从导入的类型库中显示的方法

现在,当我尝试将类型库导入到delphi中,创建pas文件后,没有方法显示在pas文件中。我可以看到随机创建方法,但没有我在C#版本中创建的原始方法,我无法想象会导致此问题失败的问题。有任何想法吗?

+0

我已经设置了大会标记有ComVisible特性,我甚至尝试设置单独的方法来标记有ComVisible特性。这没有用。 – 2009-08-07 21:08:26

+0

删除原件,因为它没有得到答案,并且包含相同的信息。 – 2009-08-08 01:58:47

回答

1

整个COM系统围绕接口旋转。基本上,你需要改变程序集中的类来实现包含你想调用的方法的接口。然后,您将能够在程序集中创建每个类的实例作为Delphi的接口,并以这种方式调用方法。

例如:

// In the assembly 
public interface IMyInterface 
{ 
    void DoSomething(); 
} 

public class MyImplementingClass : IMyInterface 
{ 
    void DoSomething() 
    { 
     // 
    } 
} 

现在您的PAS文件将得到一个接口声明包括DoSomething的方法,和一对夫妇的GUID。

从Delphi调用这个方法,你会使用类似下面的代码:

procedure CallDoSomething; 
var 
    hr: HResult; 
    Intf: IMyInterface; 
    TypeLib: ITypeLib; 
begin 
    OLECHECK(LoadRegTypeLib(LIBID_MyAssembly, MyAssemblyMajorVersion, MyAssemblyMinorVersion, 0, TypeLib)); 

    Intf := nil; 
    hr := CoCreateInstance(CLASS_MyImplementingClass, nil, CLSCTX_INPROC_SERVER, IID_IMyInterface, Intf); 
    if Failed(hr) then 
    raise Exception.CreateFmt('Failed to create instance of interface. (%x)', [hr]); 

    Intf.DoSomething(); 
end; 
+0

我去了,并创建了一个模拟你的测试程序集。并且PAS文件创建具有GUID但不具有方法DoSomething。 – 2009-08-10 16:51:16

+0

PAS文件是否包含接口声明? – 2009-08-10 18:51:12

相关问题