在Visual Studio C#中使用COM +对象而不使用Interop-DLL

时间:2013-07-16 08:56:30

标签: c# dll com interop com-interop

我正在编写使用其他应用程序的程序 让我们说应用程序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的动态!     除非我想使用theProgType.InvokeMethod():)
 2.我没有智能感知。

非常感谢

1 个答案:

答案 0 :(得分:1)

我不能帮助自己对这个问题给出一个迟到的答案,因为我刚刚处理过类似的事情。

基本上,您可以定义自己的接口子集,仅通过后期绑定来使用,这里的方法如下:

[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);

在我看来,它比动态更好,因为它为你提供了编译时类型安全(类型)和智能感知。