我使用Delphi 2010使用Hosting CLR in Delphi中描述的技术访问存储在Visual Studio 2008中编写的C#程序集中的对象。这些技术确实有效,我可以通过接口获取.NET类的实例,并调用其方法并读取它的属性。只要参数是简单的参数(如字符串,整数,字符和布尔值),调用方法就可以正常工作。但是,如果我尝试传递一个IDispatch引用的参数,C#/ .NET代码只会将该参数视为空值。
与Delphi示例中的Hosting CLR的一个不同之处在于我没有手动定义Delphi和C#中的接口。相反,我在Delphi 2010中将接口类型库编写为RIDL文件。然后我将该RIDL文件编译成TLB文件,然后使用Microsoft的TLBIMP.EXE从DLL构建COM / Interop DLL,然后我添加一个引用到C#项目中的那个DLL。我使用这种方法来定义COM对象的接口,我将其用于接口使用(如Delphi中的Hosting CLR中所述),以及定义我作为参数传递的IDispatch接口的接口。
这是我在Delphi中使用的接口,以及我使用的C#类实现的接口(.NET元数据):
[TypeLibType(4160)]
[Guid("C4D342E4-62A0-4049-BF1E-9F2A6EE19E5E")]
public interface ITestInterface
{
[DispId(203)]
int Run(object Test);
}
Delphi可以启动CLR,然后实例化一个实现ITestInterface的C#对象。 Delphi可以调用Run,我可以验证Run是否正确执行。返回值是预期的,如果我传递“对象测试”以外的参数(重写接口),则可以正确看到这些参数。但是当我传递对Test接口的IDispatch对象的引用时,C#代码只将其视为NULL。尝试使用“as”将参数强制转换为正确的接口不会失败 - 但它会导致NULL,因为初始值似乎为NULL。
我进行了双重检查,当它离开Delphi时值不为NULL。
我猜我需要在C#端执行某种额外的编组步骤,以正确获取IDispatch对象支持的接口。
任何想法,建议都将不胜感激。
答案 0 :(得分:1)
CLR不知道如何处理原始接口指针而没有类型信息。您需要传递VT_DISPATCH类型的VARIANT。这将映射到C#端的__ComObject,需要后期绑定才能对该引用进行调用。
答案 1 :(得分:1)
Hello Jason你好看看这篇文章Create a Custom Marshaling Implementation 也许它会为你试图解决的问题提供一些线索。