C# 获取方法的集合

C# 获取方法的集合,c#,reflection,C#,Reflection,想象一下以下情况: 程序集A正在启动程序。(它有一个主要方法) 它通过反射加载程序集B,并实例化程序集B的一个类 在本例中,将在我希望访问程序集B的位置调用一个方法 我已经试过了 System.Reflection.Assembly.GetCallingAssembly(); System.Reflection.Assembly.GetExecutingAssembly(); 但他们总是给我装配A而不是B。试试这个示例 public static object ExecuteAssembly

想象一下以下情况:

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

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

在本例中,将在我希望访问程序集B的位置调用一个方法

我已经试过了

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() { }