2

C#でのリフレクションを学習しようとしていますが、コードについてサポートが必要です。良いコード例/ガイドを見つけるのに苦労したので、コードがうまくできていない場合はお詫びします。

基本的に、特定のメソッド名について特定のアセンブリdllをチェックアウトしようとしています(パスとメソッド名は編集されています)。

問題は回線上で発生し、次のobject lateBoundObj = asm.CreateInstance(typeName);ようになります。An object reference is required for the non-static field, method, or property...

私はこれが静的対非静的とnew Assemblyそれらの線に沿ってまたは何かを作成することに関係していることを理解していますが、問題とそれを修正する方法を理解するのにいくらかの助けが必要です。

ありがとうございました!

 public const string assemblyPath = @"<my file path>";
    Assembly asm;

    static void Main(string[] args)
    {
        //asm = new Assembly();
        Console.Read();

        MethodInfo mi;
        object result = null;
        object[] arguments = new object[] { "ABC123" };

        try
        {
            Assembly assemblyInstance = Assembly.LoadFrom(assemblyPath);
            Type[] types = assemblyInstance.GetTypes();

            foreach (Type t in types)
            {
                mi = t.GetMethod("<my method name>");

                if (mi != null)
                {
                    string typeName = t.FullName;
                    object lateBoundObj = asm.CreateInstance(typeName);
                    result = t.InvokeMember("GetWeb", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, lateBoundObj, arguments);
                    break;
                }
            }
            //set return for find method
        }
        catch (Exception ex) { }
    }
4

2 に答える 2

6

問題は、に値を割り当てていないasmため、デフォルト値の。が設定されていることですnull。おそらくあなたはassemblyInstance代わりに使うつもりでしたか?

実際、私は使用しないAssembly.CreateInstanceType.FullName、まったく使用しません-使用します:

object lateBoundObj = Activator.CreateInstance(t);

また、次のようなコードは常に避ける必要があることに注意してください。

catch (Exception ex) { }

常に少なくとも例外をログに記録します。理想的には、実際にはまったく「処理」できない例外をキャッチしないでください。

于 2012-09-12T14:41:14.083 に答える
2

asm変数が割り当てられることはありません。代わりに電話する必要がありますCreateInstanceassemblyInstance

于 2012-09-12T14:45:46.907 に答える