在不使用Interop-DLL的情况下,在Visual Studio C#中使用COM+对象

3
我正在编写使用另一个应用程序的程序。
假设应用程序的ProgID是TheCompany.TheProg
迄今为止,我一直在使用“添加引用/COM”并选择TheProg Type Lib
但第三方供应商提到创建Interop DLL不受支持,并可能导致版本升级时出现一些接口更改。
我的问题是:如何引用此TheCompany.TheProg COM+对象而不需要创建Interop DLL?
我知道可以使用
Type theProgType = Type.GetTypeFromProgID("TheCompany.TheProg");
dynamic myObject = Activator.CreateInstance(theProgType);
dynamic version = myObject.AMethod();

但是: 1. 我需要将所有内容都动态转换,这需要 .NET FW v4! 除非我想使用 theProgType.InvokeMethod() :) 2. 我没有智能感知。
非常感谢。

我知道这已经过时了,但如果你仍在寻找答案,也许我的答案适用于你。 - noseratio - open to work
1个回答

2

我忍不住要对这个问题做出晚回答,因为我刚刚处理了类似的事情。

基本上,你可以定义自己的接口子集,只能通过后期绑定使用,以下是方法:

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] // late binding only
[Guid("00020400-0000-0000-C000-000000000046")] // IDispatch's GUID
interface IMyLateBindingAdaptor
{
    // a subset of IWebBrowser2 [http://msdn.microsoft.com/en-us/library/aa752127(v=vs.85).aspx]
    string LocationURL { get; }
    void Navigate(string url, ref object flags, ref object TargetFrameName, ref object PostData, ref object Headers);
}

确保定义属性和方法的名称和签名与您供应商的规范匹配。

使用它:

var adaptor = this.webBrowser1.ActiveXInstance as IMyLateBindingAdaptor;
if (null == adaptor)
    throw new ApplicationException("No late binding.");
object missing = Type.Missing; // VT_EMPTY
adaptor.Navigate("http://www.example.com", ref missing, ref missing, ref missing, ref missing);
MessageBox.Show(adaptor.LocationURL);

在我看来,它比动态语言更好,因为它提供了编译时类型安全(某种程度上)和智能感知。

1
与TLBImp不同,此方法没有显式绑定到来自供应商的任何API,除了名称本身。也没有数字DISPIDs,因此C#在运行时需要解析新名称时将调用IDispatch::GetIDsOfNames。您的供应商可能会更改方法、GUID、DISPIDs的顺序或添加新方法。但只要他们保持现有方法的方法名称和参数相同,您的代码就可以在不重新编译的情况下工作。您只需放入新的COM服务器DLL即可。 - noseratio - open to work
1
仍然不确定它是否会完全创建这个,但是请查看http://clrinterop.codeplex.com/releases/view/17579,这是一个更灵活的`TLBIMP`工具。 - Tomer W
1
请确保您的 MyInterfacesGUID 正好是这个:[Guid("00020400-0000-0000-C000-000000000046")](即 IDispatch 的 GUID)。我希望 TLBIMP 生成一个不同的 GUID,所以请确保将其更改为上述 GUID。 - noseratio - open to work
2
啊啊啊啊啊啊啊啊!现在我明白你的意思了! :) 你让这个类从IDispach派生,而不是原始GUID...干得好...能工巧匠,但还需要更多的努力才能完成:\ - Tomer W
1
没错,这就是纯粹的后期绑定的诀窍:] 很高兴它为你工作了! - noseratio - open to work
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接