【问题标题】:Use a COM+ object in Visual Studio C# without using Interop-DLL在 Visual Studio C# 中使用 COM+ 对象而不使用 Interop-DLL
【发布时间】:2013-07-14 09:00:44
【问题描述】:

我正在编写使用另一个应用程序的程序。
假设应用程序 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。

非常感谢

【问题讨论】:

  • 我知道这已经过时了,但如果您仍在寻找答案,也许我的答案会为您工作。

标签: c# dll com interop com-interop


【解决方案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);

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

【讨论】:

  • 没有。与 TLBImp 不同,这种方法没有显式绑定到您的供应商提供的任何 API,除了名称本身。也没有数字 DISPID,因此 C# 将在运行时调用IDispatch::GetIDsOfNames,只要它需要解析新名称。您的供应商可能会更改方法、GUID、DISPID 的顺序,或添加新方法。但是只要它们保持现有方法的方法名称和参数相同,您的代码就可以在不重新编译的情况下工作。您只需放入新的 COM 服务器 DLL。
  • 仍然不知道它是否会准确地创建这个,但是看看clrinterop.codeplex.com/releases/view/17579 它是一个更灵活的TLBIMP 工具
  • 确保您的MyInterfacesGUID 是这样的:[Guid("00020400-0000-0000-C000-000000000046")](IDispatch 之一)。我希望 TLBIMP 生成一个不同的,确保将其更改为上述内容。
  • 啊啊啊啊!!!现在我明白你的意思了! :) 你让这个类派生自 IDispach,而不是原来的 GUID……做得好……工作但需要做很多工作:\
  • 是的,这就是纯后期绑定的诀窍 :] 很高兴它为你解决了!
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2010-11-02
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2017-02-15
相关资源
最近更新 更多