2

想象以下情况:

程序集 A 正在启动程序。(它有一个主要的方法)

它通过反射加载程序集 B 并实例化一个程序集 B 类。

在这种情况下,在我想到达 Assembly B 的地方调用了一个方法。

我已经试过了

System.Reflection.Assembly.GetCallingAssembly();

System.Reflection.Assembly.GetExecutingAssembly();

但他们总是给我组装 A 而不是 B。

4

3 回答 3

4

尝试获取包含您要使用的方法的类类型并获取其程序集。

string assemblyName = this.GetType().Assembly.FullName;
于 2013-05-24T12:13:59.350 回答
3

Assembly.GetExecutingAssembly() 是正确使用的方法。

你只留下很少的面包屑来诊断它遇到问题的原因。然而,这有一些附加条件。抖动执行的一项重要工作是使方法消失。这是一种称为“内联”的优化。实际上,对方法的调用被方法的代码所取代。这是一个非常重要的优化,例如它使属性与使用公共字段一样便宜。但结果是您将获得调用方法的程序集。在你的情况下Main()。所以你会看到程序集 A 而不是 B。

这不是你应该修补的东西,避免需要这个。一个方法不应该对它所在的程序集感到困惑,例如,您可以使用 typeof(T).Assembly 属性,其中 T 是该方法所在的类。

可以禁用内联优化,您可以使用属性:

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;

        }

用法:-

程序集 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 回答