我使用codedom
编译了.cs文件,并通过invokemember
提取其方法。但我如何从该方法中获得价值?例如:我想获得已在方法
这是我的代码
string[] filepath = new string[1];
filepath[0] = @"C:\Users\xxxx\Documents\Visual Studio 2010\Projects\xxx\xx\invokerteks.cs";
CodeDomProvider cpd = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Web.dll");
cp.GenerateExecutable = false;
CompilerResults cr = cpd.CompileAssemblyFromFile(cp, filepath);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
Assembly invokerAssm = cr.CompiledAssembly;
Type invokerType = invokerAssm.GetType("dynamic.hello");
object invokerInstance = Activator.CreateInstance(invokerType);
invokerType.InvokeMember("helloworld", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, invokerInstance, null);
这是我的invokerteks.cs
namespace dinamis
{
public class halo
{
private void halodunia()
{
System.Console.WriteLine("Hello World!!");
}
}
}
你可以为我提供这个问题的链接教程吗?
答案 0 :(得分:0)
InvokeMember
将返回该方法返回的任何内容。由于您的helloworld方法返回void
,因此不会返回任何内容。为了解决问题,请定义您的返回类型并像往常一样调用:
public class Hello
{
private int helloworld()
{
return new Random().NextInt();
}
}
可以这样称呼:
var type = typeof(Hello);
int value = (int)type.InvokeMember("helloworld", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, invokerInstance, null);
InvokeMember
始终返回object
的实例,因此您必须转换为所需的类型。这里要注意无效的演员表。