得到方法的集合

时间:2013-05-24 12:06:20

标签: c# reflection

想象一下以下情况:

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

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

在这个实例中调用了一个方法,我希望到达程序集B.

我已经尝试了

System.Reflection.Assembly.GetCallingAssembly();

System.Reflection.Assembly.GetExecutingAssembly();

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

3 个答案:

答案 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);