2012-07-31 183 views
5

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

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

谢谢!

+0

这是可能的,但你必须调用C#编译器..不平凡。更容易要求你的mod被编译成dll,然后你可以加载并用反射调用。 – Blorgbeard 2012-07-31 23:40:21

+0

可能需要考虑使用Roslyn – Prescott 2012-07-31 23:40:50

回答

6

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

从本质上讲,你想拉你的文本文件到的CodeDOM和编译。之后,创建一些动态方法作为执行助手可能会有所帮助。

  • 接收上传的文件
  • 上的文件
  • 执行任何所需的验证读取文件作为串入的CodeDOM
  • 应付任何的编译器/结构错误
  • 使用LINQ表达式创建的helper方法树或动态方法,以便新类和现有代码之间的链接与编译对象桥接(否则,所有新方法都需要使用反射来调用)

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()); 

另外,请参阅本主题:Implementing a scripting language in C#IronPython与DLR可能适合您的需求。

+0

就是这样 - 我不一定要编译它,我只是需要它作为脚本运行。 – Scott 2012-07-31 23:46:31

+1

我明白了。仅供参考,脚本也编译,只是在飞行中。根据您的性能需求,动态编译可能是合适的,尽管c#编译可能不太适合实时操作。 – 2012-07-31 23:48:25

+0

这看起来非常棒,我会添加它!谢谢! – Scott 2012-07-31 23:54:38

1

使用,处理插件

一个框架托管扩展框架正是你要找的

http://mef.codeplex.com/

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

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

DLL与文本(源代码)

插件显影剂预计提供一种含有该插件代码的DLL。但是,如果需要,您可以使用Roslyn将源代码编译为DLL。请记住,如果你想支持接收插件源代码,你还必须提供支持来帮助用户处理编译错误并在你的框架中调试插件。要求他们提供DLL可能更为明智。

+1

这是否可以使用.txt文件作为类?我认为他需要实质性编译它 – Prescott 2012-07-31 23:41:58

+0

@Prescott:更新了我的答案以解决这一问题。 – 2012-07-31 23:45:13

+0

有关此任何更新? – 2016-06-20 16:29:47

3

您可以加载文本文件,然后使用一些编译器即服务(Microsoft's pre-release Roslyn projectMono.CSharp)。然后,您可以将编译后的输出结果在程序中运行。

如果完全有可能让用户接收一个已编译的程序集而不是未编译的源文件,则应考虑Managed Extensibility FrameworkMono.Addins

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

+0

谢谢!我会看看罗斯林,有几条评论在谈论这件事。 – Scott 2012-07-31 23:45:05

+2

不要低估Mono.CSharp - 这是一个“完成的产品”,它的界面你可以期望不会改变。 Roslyn的界面在当前的CTP状态和最终的RTM之间很可能会发生变化。一旦它接近发货,Roslyn可能是一个典型的.NET项目的更合适的选择,但请记住,Mono程序集与其他程序集一样运行在微软的CLR上。 – sblom 2012-07-31 23:48:03

相关问题