3

別のアプリケーションを使用するプログラムを作成しています。
アプリケーションの ProgID がTheCompany.TheProgだとしましょう

今まで、「Add References/COM」を使用して、TheProg Type Libを選択していました。

ただし、サード パーティ ベンダーは、相互運用 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. 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 に答える