这就是我正在做的:我目前需要在delphi中打开和使用.NET程序集。我试图使用的程序集也具有它正在使用的对象的程序集。我能够使用regasm为主组件创建一个类型库。我也能够分配一个SN并在GAC中注册。在Delphi中没有显示从导入的类型库中显示的方法
现在,当我尝试将类型库导入到delphi中,创建pas文件后,没有方法显示在pas文件中。我可以看到随机创建方法,但没有我在C#版本中创建的原始方法,我无法想象会导致此问题失败的问题。有任何想法吗?
这就是我正在做的:我目前需要在delphi中打开和使用.NET程序集。我试图使用的程序集也具有它正在使用的对象的程序集。我能够使用regasm为主组件创建一个类型库。我也能够分配一个SN并在GAC中注册。在Delphi中没有显示从导入的类型库中显示的方法
现在,当我尝试将类型库导入到delphi中,创建pas文件后,没有方法显示在pas文件中。我可以看到随机创建方法,但没有我在C#版本中创建的原始方法,我无法想象会导致此问题失败的问题。有任何想法吗?
整个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;
我去了,并创建了一个模拟你的测试程序集。并且PAS文件创建具有GUID但不具有方法DoSomething。 – 2009-08-10 16:51:16
PAS文件是否包含接口声明? – 2009-08-10 18:51:12
我已经设置了大会标记有ComVisible特性,我甚至尝试设置单独的方法来标记有ComVisible特性。这没有用。 – 2009-08-07 21:08:26
删除原件,因为它没有得到答案,并且包含相同的信息。 – 2009-08-08 01:58:47