4

C# を使用してプログラム内から CorelDRAW を開こうとしています。これまでのところ、適切なcomライブラリを参照して呼び出すことでこれを行うことができました

CorelDRAW.Application draw = new CorelDRAW.Application();
draw.Visible = true; 

ただし、相互運用をサポートする CorelDRAW の任意のバージョンでプログラムを動作させたいと考えています。リフレクションを使用して、実行時に相互運用ライブラリをロードしようとしています。ここでは、正しいバージョンの特定の dll を選択できます。周りを見て、私は次のことを試しました。

string path = "Interop.CorelDRAW.dll";
Assembly u = Assembly.LoadFile(path);
Type testType = u.GetType("CorelDRAW.Application");

if (testType != null)
{
    object draw = u.CreateInstance("CorelDRAW.Application");

    FieldInfo fi = testType.GetField("Visible");
    fi.SetValue(draw, true);
}

クラスではなくインターフェイスであるu.CreateInstance...ため、プログラムは失敗します。また、Interop.CorelDRAW をリソースとして参照するときに利用できるものにCorelDRAW.Application置き換えようとCorelDRAW.Applicationしましたが、失敗します。CorelDRAW.ApplicationClassu.getType...

どうすればこれを機能させることができますか? ありがとうございました!

4

2 に答える 2

4

次の構成を使用して、登録された ActiveX オブジェクトのインスタンスを作成できます。

Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true);
object vc = Activator.CreateInstance(type);

次に、返されたオブジェクトを処理する方法について、3 つのオプションがあります。

  1. 返されたオブジェクトを実際の CorelDRAW.Application インターフェイスにキャストしますが、そのためにはそれを含む CorelDraw ライブラリを参照する必要があり、おそらくこれによりバージョン管理の問題が発生します。

  2. あなたの質問で言及したリフレクション。

  3. dynamic キーワードを使用すると、実際の CorelDraw クラス/インターフェイスのように、既存のメソッドとプロパティを呼び出すことができます。

    Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true);
    dynamic vc = (dynamic)Activator.CreateInstance(type);
    vc.Visible = true;
    
于 2013-03-22T21:52:37.307 に答える