C# – 将文本文件作为类加载

有没有办法将.txt文件作为一个类加载,我的主程序可以从中调用函数? 我基本上试图将mod支持添加到我的简单应用程序中,用户可以从每个文件中选择选项。 该文件遵循类似(但不相同)的格式,在主程序中调用一堆空白(函数)。

我怎样才能做到这一点? 甚至可能这样做(可能不是,回答我自己的问题?),考虑到它不会与程序的其余部分一起编译?

谢谢!

请看这个问题的答案: 在运行时编译C#数组并在代码中使用它?

基本上,您可能希望将文本文件拉入CodeDom并进行编译。 在那之后,创建一些动态方法作为执行助手可能会有所帮助。

  • 接收上传的文件
  • 对文件执行任何所需的validation
  • 将文件作为字符串读入CodeDom
  • 处理任何编译器/结构错误
  • 使用Linq表达式树或动态方法创建辅助方法,以便新类和现有代码之间的链接与编译对象桥接(否则,需要使用reflection调用所有新方法)

var csc = new CSharpCodeProvider( new Dictionary() { { "CompilerVersion", "v4.0" } } ); var cp = new CompilerParameters() { GenerateExecutable = false, OutputAssembly = outputAssemblyName, GenerateInMemory = true }; cp.ReferencedAssemblies.Add( "mscorlib.dll" ); cp.ReferencedAssemblies.Add( "System.dll" ); StringBuilder sb = new StringBuilder(); // The string can contain any valid c# code sb.Append( "namespace Foo{" ); sb.Append( "using System;" ); sb.Append( "public static class MyClass{"); sb.Append( "}}" ); // "results" will usually contain very detailed error messages var results = csc.CompileAssemblyFromSource( cp, sb.ToString() ); 

另请参阅此主题: 在C#中实现脚本语言 。 使用DLR的IronPython可能适合您的需求。

您可以加载文本文件,然后使用一些Compiler-as-a-service( Microsoft的预发布Roslyn项目或Mono.CSharp )。 然后,您可以获取已编译的输出并在程序中运行它们。

如果您的用户可以使用已编译的程序集而不是未编译的源文件,那么您应该考虑Managed Extensibility Framework或Mono.Addins 。

第二种方法(扩展程序集)对我来说似乎更好,至少有两个原因:1)您的用户可以使用他们想要的任何开发环境,以确保他们的代码在交付给您之前正确编译,并且2)您的用户更少努力validation输入和处理故障。

使用处理插件的框架

Managed Extensibility Framework正是您所需要的

http://mef.codeplex.com/

托管可扩展性框架(MEF)是.NET的组合层,可提高大型应用程序的灵活性,可维护性和可测试性。 MEF可用于第三方插件可扩展性,或者它可以将松散耦合的类似插件的体系结构的优势带给常规应用程序。

MEF提供了一个定义良好的架构来支持应用程序中的插件。

DLL与文本(源代码)

插件开发人员应该提供包含插件代码的DLL。 但是,如果需要,您可以使用Roslyn将源代码编译为DLL。 请记住,如果您想支持接收插件源代码,您还必须提供支持,帮助用户处理编译器错误并在框架内调试插件。 要求他们提供DLL可能更明智。