想象以下情况:
程序集 A 正在启动程序。(它有一个主要的方法)
它通过反射加载程序集 B 并实例化一个程序集 B 类。
在这种情况下,在我想到达 Assembly B 的地方调用了一个方法。
我已经试过了
System.Reflection.Assembly.GetCallingAssembly();
System.Reflection.Assembly.GetExecutingAssembly();
但他们总是给我组装 A 而不是 B。
想象以下情况:
程序集 A 正在启动程序。(它有一个主要的方法)
它通过反射加载程序集 B 并实例化一个程序集 B 类。
在这种情况下,在我想到达 Assembly B 的地方调用了一个方法。
我已经试过了
System.Reflection.Assembly.GetCallingAssembly();
System.Reflection.Assembly.GetExecutingAssembly();
但他们总是给我组装 A 而不是 B。
尝试获取包含您要使用的方法的类类型并获取其程序集。
string assemblyName = this.GetType().Assembly.FullName;
Assembly.GetExecutingAssembly() 是正确使用的方法。
你只留下很少的面包屑来诊断它遇到问题的原因。然而,这有一些附加条件。抖动执行的一项重要工作是使方法消失。这是一种称为“内联”的优化。实际上,对方法的调用被方法的代码所取代。这是一个非常重要的优化,例如它使属性与使用公共字段一样便宜。但结果是您将获得调用方法的程序集。在你的情况下Main()。所以你会看到程序集 A 而不是 B。
这不是你应该修补的东西,避免需要这个。一个方法不应该对它所在的程序集感到困惑,例如,您可以使用 typeof(T).Assembly 属性,其中 T 是该方法所在的类。
您可以禁用内联优化,您可以使用属性:
using System.Runtime.CompilerServices;
...
[MethodImpl(MethodImplOptions.NoInlining)]
public void Foo() { }
试试这个样品,
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);