C#动态方法调用
2021-06-18 00:07
标签:parameter VID ros gen one 类库 文件 else sem 此篇将介绍C#如何在运行时动态调用方法。当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的。此篇则给你一把利剑,让动态对象的方法调用成为可能。 C#动态方法调用 标签:parameter VID ros gen one 类库 文件 else sem 原文地址:https://www.cnblogs.com/blogs2014/p/10315864.html1.动态调用dll里的方法:
"font-family:SimSun;font-size:12px;">///
2.动态加载类文件并调用方法: using System;
using System.CodeDom.Compiler;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;
using Microsoft.CSharp;
namespace _32.DynamicReflection
{
internal class Program
{
private static void Main(string[] args)
{
#region 内置标签方法 (动态加载)
const string className = "DynamicReflection.Test"; //类名称一定要全称
string fileName = Thread.GetDomain().BaseDirectory + "Test.cs";
if (File.Exists(fileName))
{
var sourceFile = new FileInfo(fileName);
CodeDomProvider provider = new CSharpCodeProvider();
var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll"); //添加命名空间引用
cp.GenerateExecutable = false; // 生成类库
cp.GenerateInMemory = true; // 保存到内存
cp.TreatWarningsAsErrors = false; // 不将编译警告作为错误
// 编译
CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile.FullName);
if (cr.Errors.Count 1)
{
Assembly asm = cr.CompiledAssembly; // 加载
//1.调用静态方法
Type type = asm.GetType(className);
var str =(string)type.InvokeMember("SayHello1", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] {});
Console.WriteLine(str);
//2.调用实例方法
object instance = asm.CreateInstance(className);
str =(string)type.InvokeMember("SayHello2", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,new object[] {});
Console.WriteLine(str);
//3.调用带参数的方法
var par = new object[] {"zhangqs008"};
str =(string)type.InvokeMember("SayHello3", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,par);
Console.WriteLine(str);
Console.Read();
}
else
{
string msg = null;
for (int index = 0; index )
{
CompilerError error = cr.Errors[index];
msg += "【错误" + (index + 1) + "】" + Environment.NewLine;
msg += "[文件] " + error.FileName + Environment.NewLine;
msg += "[位置] 行" + error.Line + ",列" + error.Column + Environment.NewLine;
msg += "[信息] " + error.ErrorText + Environment.NewLine;
msg += Environment.NewLine;
}
MessageBox.Show(msg, "内置方法类编译错误");
}
}
#endregion
}
}
}
类文件:
DynamicReflection
{
public class Test
{
public static string SayHello1()
{
return "hello static method";
}
public string SayHello2()
{
return "hello instance method";
}
public string SayHello3(string args)
{
return "hello args " + args;
}
}
}