8

我想从我自己的代码中调用 .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});
4

2 回答 2

9

您正在使用当前代码将字符串数组作为单个参数传递。

由于string[]可以强制转换为object[],因此您只需将parameters数组传递给Invoke.

string result = (string)mi.Invoke(null, parameters);
于 2012-08-21T20:38:05.213 回答
3

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

如果您没有控制(或无法签署)程序集 - 如果必须,反射是执行此操作的方法。当程序集以任何形式发生变化时,调用第三方程序集的内部方法是一种让人头疼的好方法。

于 2012-08-21T20:46:45.220 回答