2011-09-07 5 views
5

Pythonでは、このCOMオブジェクトを使用したいときは、すべて私が行うのはwin32com.client.Dispatch("Myapp.Thing.1")で、メソッドなどを呼び出すことができるオブジェクトを与えます。 。C#でレガシーCOMオブジェクトを動的にインスタンス化する(文字列のIDを使用)

私はこれをC#でやってみたいと思いますが、驚くことに、どうやって分かりませんか。私はではありません私が入ることができない理由のためにそれらの自動的に生成されたCOMラッパーの1つを使用したいです。私は時代遅れのバインディング、時代のダイナミックなCOMを行う必要があります。

私はこれを試みましたが、呼び出し呼び出しでNull Ref Exceptionを取得しました。

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.GetMethod("xyz").Invoke(o, args) 

COMオブジェクトを名前でロードして基本的な方法で使用できるサンプルコードは理想的です。

+0

Jasonまず、コードにいくつかのチェックを追加して、tまたはoをnullとして識別できますか?もしそうなら、あなたが私たちに言ったら、それを見始めることができます。 –

+0

私はちょうどその場所にそれらの小切手を頼りにしています。どちらもtもoも戻ってきていません。あなたの助けをありがとう! – William

+0

、そのオブジェクトにメソッドxyzが存在することを確認していますか? –

答えて

8

タイプがGetTypeFromProgIDで取得された場合、実際にはタイプはありません。作成されたCOMオブジェクトをラップする__ComObjectタイプがあります。そのため、メソッド「xyz」はありません。したがって、null参照例外 - GetMethod("xyx")がnullを返しています。メソッドを呼び出すために

、代わりにt.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args)を使用します。

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) 
+0

動作しているようです。そして、どのようにプロパティを取得/設定しますか?本当にありがとう! – William

+0

あなたはまだInvokeMemberを使用しています。 'BindingFlags'パラメータは、あなたがやることを制御します。' BindingFlags.GetField'や 'BindingFlags.GetProperty'などを使用します。 http://msdn.microsoft.com/en-us/library/66btctbe.aspxおよびhttp://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspxを参照してください。 –

8

あなたは、それはまさにそれがために何だ動的な型を使用する必要があります。ラッパーなしでインスタンスを入力することはできません。代わりにこれを行うことができます。

dynamic app = Activator.CreateInstance(
             Type.GetTypeFromProgID("MyApp.Thing.1")); 
app.XYZ(): 
関連する問題