有什么办法加载.txt文件作为一个类,然后我的主程序可以调用函数?我基本上试图将mod支持添加到我的简单应用程序,用户可以从每个文件中选择选项。该文件遵循类似(但不是相同)的格式,并在主程序中调用一堆空白(函数)。C# - 加载一个文本文件作为一个类
我该怎么做?甚至有可能做(可能不是,回答我自己的问题?),考虑到它不会与程序的其余部分一起编译?
谢谢!
有什么办法加载.txt文件作为一个类,然后我的主程序可以调用函数?我基本上试图将mod支持添加到我的简单应用程序,用户可以从每个文件中选择选项。该文件遵循类似(但不是相同)的格式,并在主程序中调用一堆空白(函数)。C# - 加载一个文本文件作为一个类
我该怎么做?甚至有可能做(可能不是,回答我自己的问题?),考虑到它不会与程序的其余部分一起编译?
谢谢!
见我回答这个问题:Compile a C# Array at runtime and use it in code?
从本质上讲,你想拉你的文本文件到的CodeDOM和编译。之后,创建一些动态方法作为执行助手可能会有所帮助。
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可能适合您的需求。
使用,处理插件
一个框架托管扩展框架正是你要找的
托管扩展框架(MEF)是一个组合物层为.NET提高了大型应用程序的灵活性,可维护性和可测试性。 MEF可以用于第三方插件的可扩展性,或者它可以将松散耦合的插件式架构的优点带给常规应用程序。
MEF提供了一个定义良好的架构来支持应用程序中的插件。
DLL与文本(源代码)
插件显影剂预计提供一种含有该插件代码的DLL。但是,如果需要,您可以使用Roslyn将源代码编译为DLL。请记住,如果你想支持接收插件源代码,你还必须提供支持来帮助用户处理编译错误并在你的框架中调试插件。要求他们提供DLL可能更为明智。
这是否可以使用.txt文件作为类?我认为他需要实质性编译它 – Prescott 2012-07-31 23:41:58
@Prescott:更新了我的答案以解决这一问题。 – 2012-07-31 23:45:13
有关此任何更新? – 2016-06-20 16:29:47
您可以加载文本文件,然后使用一些编译器即服务(Microsoft's pre-release Roslyn project或Mono.CSharp)。然后,您可以将编译后的输出结果在程序中运行。
如果完全有可能让用户接收一个已编译的程序集而不是未编译的源文件,则应考虑Managed Extensibility Framework或Mono.Addins。
第二种方法(扩展程序集)对我来说似乎更好,至少有两个原因:1)您的用户可以使用任何开发环境,以确保其代码在交给您之前正确编译; 2 )你需要做更少的工作来验证输入和处理失败。
这是可能的,但你必须调用C#编译器..不平凡。更容易要求你的mod被编译成dll,然后你可以加载并用反射调用。 – Blorgbeard 2012-07-31 23:40:21
可能需要考虑使用Roslyn – Prescott 2012-07-31 23:40:50