5

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

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

谢谢!

4

3 回答 3

6

看我对这个问题的回答:Compile a C# Array at runtime and use it in code?

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

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

var csc = new CSharpCodeProvider( new Dictionary<string, string>() { { "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可能适合您的需求。

于 2012-07-31T23:43:08.697 回答
3

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

如果完全有可能让您的用户向您提供已编译的程序集而不是未编译的源文件,您应该考虑托管可扩展性框架Mono.Addins

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

于 2012-07-31T23:41:38.527 回答
1

使用处理插件的框架

托管可扩展性框架正是您正在寻找的

http://mef.codeplex.com/

托管可扩展性框架 (MEF) 是 .NET 的组合层,可提高大型应用程序的灵活性、可维护性和可测试性。MEF 可用于第三方插件扩展,或者它可以为常规应用程序带来松散耦合的插件式架构的好处。

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

DLL 与文本(源代码)

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

于 2012-07-31T23:40:24.960 回答