我想从我自己的代码中调用.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...
}
使用此代码我可以看到哈希方法,但我该如何调用呢?
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});
答案 0 :(得分:9)
您正在使用当前代码将字符串数组作为单个参数传递。
由于string[]
可以强制转换为object[]
,您只需将parameters
数组传递到Invoke
。
string result = (string)mi.Invoke(null, parameters);
答案 1 :(得分:3)
如果您需要将其用于测试目的,请考虑使用InternalsVisibleTo属性。这样,您可以使测试程序集成为主程序集的“朋友”并调用内部方法/类。
如果您没有控制(或无法签名)程序集 - 如果必须,可以使用反射方法。当组件以任何形式变化时,调用第三方组件的内部方法是让头疼的好方法。