Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个可执行文件调用内部类中的函数_C#_.net_Reflection - Fatal编程技术网

C# 从另一个可执行文件调用内部类中的函数

C# 从另一个可执行文件调用内部类中的函数,c#,.net,reflection,C#,.net,Reflection,我想从我自己的代码中调用.net可执行文件中的函数。 我用反射器看到了这个: namespace TheExe.Core { internal static class AssemblyInfo internal static class StringExtensionMethods } 在命名空间中,TheExe.Core是我感兴趣的函数: internal static class StringExtensionMethods { // Methods pu

我想从我自己的代码中调用.net可执行文件中的函数。 我用反射器看到了这个:

namespace TheExe.Core
{
    internal static class AssemblyInfo
    internal static class StringExtensionMethods
}
在命名空间中,TheExe.Core是我感兴趣的函数:

internal static class StringExtensionMethods
{
    // Methods
    public static string Hash(this string original, string password);
    // More methods...
}
使用这段代码,我可以看到Hash方法,但是如何调用它呢

Assembly ass = Assembly.LoadFile("TheExe");
Type asmType = ass.GetType("TheExe.Core.StringExtensionMethods");
MethodInfo mi = asmType.GetMethod("Hash", BindingFlags.Public | BindingFlags.Static);
string[] parameters = { "blabla", "MyPassword" };

// This line gives System.Reflection.TargetParameterCountException
// and how to cast the result to string ?
mi.Invoke(null, new Object[] {parameters});

您正在将字符串数组作为单个参数与当前代码一起传递

由于可以将
string[]
强制为
object[]
,因此您只需将
参数
数组传递到
Invoke

string result = (string)mi.Invoke(null, parameters);

如果您需要这个用于测试目的,请考虑使用IntualSVisialto属性。通过这种方式,您可以使您的测试程序集成为主程序集的“朋友”,并调用内部方法/类


如果您没有控制(或无法对)程序集进行签名,那么如果必须这样做,反射就是一种方法。调用第三方程序集的内部方法是在程序集以任何形式更改时遇到麻烦的好方法。

AFAIK,
internal
access修饰符的意图是:不让您这样做。=)@乡下人。开发者是的,你可以。扩展方法仍然是常规静态方法,可以使用常规语法调用。扩展方法语法是可选的,并且是可添加的。@AndreCalil除非这是metro应用程序,否则您可以通过反射调用
内部
私有
类和方法。访问修饰符不是一种安全预防措施。@AndreCalil,是的-您可以通过反射调用任何东西(包括参数为私有类的私有方法)。(假设Remko得到的对象/方法信息是正确的)。@AlexeiLevenkov Nice,我认为反射应该尊重访问修饰符,但@AndreCalil从技术上讲,访问非公共成员需要反射权限(公共成员总是可以通过反射获得),但这不是程序集作者可以决定的。它取决于调用代码的安全上下文。例如,如果我以管理员的身份运行客户端代码,那么您的库无法阻止我使用反射。然而,客户机代码可以创建一个沙箱来限制其他代码使用反射API。是的,我知道这种风险,但我的使用可以接受(+1)