2

次の状況を想像してください。

アセンブリ A がプログラムを開始しています。(メインメソッドがあります)

リフレクションを介してアセンブリ B を読み込み、アセンブリ B のクラスをインスタンス化します。

この例では、アセンブリ B に到達したい場所でメソッドが呼び出されます。

私はすでに試しました

System.Reflection.Assembly.GetCallingAssembly();

System.Reflection.Assembly.GetExecutingAssembly();

しかし、彼らはいつも私に B ではなくアセンブリ A をくれます。

4

3 に答える 3

3

Assembly.GetExecutingAssembly() を使用するのが適切な方法です。

問題が発生した原因を診断するための貴重なパンくずリストを残します。ただし、これには紐が付けられています。ジッターによって実行される重要な仕事は、メソッドを非表示にすることです。これは「インライン化」と呼ばれる最適化です。実際には、メソッドへの呼び出しはメソッドのコードに置き換えられます。これは非常に重要な最適化です。たとえば、プロパティを public フィールドを使用するのと同じくらい安くします。しかし、その結果、呼び出し元のメソッドのアセンブリが得られます。あなたの場合、Main()。したがって、アセンブリ B ではなくアセンブリ A が表示されます。

これはあなたがいじるべきものではありません。これが必要になることは避けてください。メソッドは、それがどのアセンブリに存在するかについて戸惑うべきではありません。たとえば、T がメソッドが存在するクラスである typeof(T).Assembly プロパティを使用できます。

インライン化の最適化を無効にすることができます。属性を使用して無効にします。

using System.Runtime.CompilerServices;
...

    [MethodImpl(MethodImplOptions.NoInlining)]
    public void Foo() { }
于 2013-05-24T12:28:53.753 に答える
0

このサンプルを試して、

public static object ExecuteAssemblyMethod(string methodName,Type assemblyObj, object[] arguments)
        {
            object result = null;
            try
            {
                object ibaseObject = Activator.CreateInstance(assemblyObj);
                result = assemblyObj.InvokeMember(methodName, BindingFlags.Default | BindingFlags.InvokeMethod, null, ibaseObject, arguments);

            }
            catch (ReflectionTypeLoadException emx)
            {
                result = null;
                return result;

            }
            catch (Exception ex)
            {
                result = null;
                return result;
            }
            return result;

        }

使用法:-

Assembly assemb = Assembly.LoadFile(@"D:\TEMP\TestClassLibrary_new.dll");

        Type testType = assemb.GetType("TestClassLibrary.Class1");
        object[] param = new object[] {"akshay" };
        object result = LoadAssembly.ExecuteAssemblyMethod("GetName", testType, param);
于 2013-05-24T12:11:48.007 に答える