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