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