如何在.net中的另一个程序集中调用私有静态类型(或类)上的方法?

时间:2016-07-15 09:09:43

标签: c# .net reflection

假设我们有一个名为“app.exe”的应用程序,它使用名为“lib.dll”的外部程序集,程序集包含一个静态类型,如下所示

internal class Foo {
    public static Foo GetInstance(string param1, string param2) {...}
    public static Foo GetInstance(string param2)
    public string Prop { get; set; }
    public string PublicMethod(string param1) { ... }
    protected string ProtectedMethod(string param1) { ... }
}

调用Foo.GetInstance(string,string)方法并使用此实例后的最佳方法是什么?该类没有实现任何接口(也不从任何公共类继承)。一个例子真的很感激。

更新:我知道OOP的原理,但我在这里寻找技术上可行的解决方案。它是反射,剔除,挂钩等,但最优选的是反射。这只是为了在第三方采用他们的代码来修复这个错误之前解锁开发团队(不幸的是我们在这里处理了很多官僚主义)。

更新:我在原始问题中犯了一个错误,有多个具有不同签名的GetInstance方法。

3 个答案:

答案 0 :(得分:2)

你做不到。这是internal 访问修饰符(VB中的Friend)的含义。标有internal的方法只能在定义它的程序集中访问。

以下是关于internal访问修饰符的documentation

答案 1 :(得分:2)

使用Type.GetType

var type = Type.GetType("NameSpace.Foo, Assembly");

有一个棘手的部分是装配限定的名称,然后:

var method = type.GetMethod(
    "GetInstance", 
    BindingFlags.Public | BindingFlags.Static, 
    null, 
    new[] { typeof(string), typeof(string) }, 
    null);
method.Invoke(null, new[] { "param1", "param2" });

答案 2 :(得分:1)

在其他lib中假设这个类

namespace PrivateLib
{
    class MyClass
    {
        private static string Foo()
        {
            return "Hello World";
        }
    }
}

你可以做到

  class Program
    {
        static void Main(string[] args)
        {
            var assembly = Assembly.LoadFile(Path.GetFullPath("PrivateLib.dll"));
            var myClass = assembly.GetType("PrivateLib.MyClass");
            //var instance = myClass.GetConstructor(new Type[]{}).Invoke(new object[] { });
            var method = myClass.GetMethod("Foo", BindingFlags.NonPublic | BindingFlags.Static);
            var result = method.Invoke(null, new object[]{});
            Console.WriteLine(result);
            Console.ReadLine();
        }
    }