3

我正在编写使用另一个应用程序的程序。
假设应用程序 ProgID 是TheCompany.TheProg

到目前为止,我一直在使用“添加引用/COM”并选择TheProg Type Lib

但是 3ed 方供应商提到不支持创建 Interop DLL,并且可能会随着版本升级而导致一些接口更改。

我的问题是:如何在不创建 Interop DLL 的情况下引用这个TheCompany.TheProg COM+ 对象?

我知道我可以使用

Type theProgType = Type.GetTypeFromProgID("TheCompany.TheProg");
dynamic myObject = Activator.CreateInstance(theProgType);
dynamic version = myObject.AMethod();

但是: 1. 我需要转换需要 .NET FW v4 的所有动态!
除非我想使用 ProgType.InvokeMethod() :)
2. 我没有 IntelliSense。

非常感谢

4

1 回答 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);

在我看来,它比动态更好,因为它为您提供编译时类型安全(某种)和 IntelliSense。

于 2013-08-21T09:21:38.373 回答