8

VB6 / COM +コードをC#/COM+に変換したいと思っています

ただし、VB6またはVB.NETのどこにありますか。

Dim objAdmin
objAdmin = Server.CreateObject("AppAdmin.GUI")
objAdmin.ShowPortal()

C#では、次のことを行う必要があるようです。

object objAdmin = null;
System.Type objAdminType = System.Type.GetTypeFromProgID("AppAdmin.GUI");
m_objAdmin = System.Activator.CreateInstance(objAdminType);
objAdminType.InvokeMember("ShowPortal", System.Reflection.BindingFlags.InvokeMethod, null, objAdmin, null);

C#でInvokeMember関数を使用せずに、関数を直接呼び出す方法はありますか?

4

3 に答える 3

11

C#でInvokeMember関数を使用せずに、関数を直接呼び出す方法はありますか?

はい、動的型付けを使用したC#4の時点で:

dynamic admin = Activator.CreateInstance(Type.GetTypeFromProgID("AppAdmin.GUI"));
admin.ShowPortal();

この部分ではさらに冗長CreateObjectですが、必要に応じていつでもメソッド呼び出しでまとめることができます。(私が知らない既存の呼び出しがある可能性があります。または、その場合にVBが呼び出しているものを見つけようとする可能性があります。詳細はわかりませんServer.CreateObject。)

動的型付けは、単に反射を単純にするよりも豊富ですが、確かにそうなることに注意してください。舞台裏では、どちらの場合も同じようなことが起こります。静的バインディングほど高速ではありませんが、ほぼ確実に十分な速度です。

于 2012-09-07T13:49:29.723 に答える
6

はい、dynamicキーワードを使用できます

dynamic objAdmin = System.Activator.CreateInstance(objAdminType);
objAdmin.ShowPortal();
于 2012-09-07T13:49:18.937 に答える
-1

実際のクラス タイプにアクセスできる場合は、次のように実行できます。

AppAdminClass m_objAdmin = (AppAdminClass)System.Activator.CreateInstance(typeof(AppAdminClass));
m_objAdmin.ShowPortal();
于 2012-09-07T13:55:31.790 に答える