我的情况是我的代码的一部分是通过CodeExpressions
生成的,另一部分是由用户自己生成的(例如:用户只是像往常一样编写代码,然后我会将其添加到我的代码中他编写时的集会。)
是否可以生成包含这两个项目的程序集?警告:这两种方法将包含partial
类,因此它们必须位于同一个程序集中。
我想到的另一种方法是将这两种方法转换为字符串表示,然后从该字符串生成程序集,但我怀疑我是否可以从用户生成的类型中获取源代码(在编译时) )。
根据这个想法,我可以将CodeExpressions生成的代码写入文本文件,并将其与.cs
文件结合起来。时间表看起来像这样:
.cs
文件的内容.dll
我可以跳过将我生成的CodeDom源写入和读取到文本文件的(冗余)步骤,并简单地将其写入内存中。实际上,使用预处理T4模板并将这些模板的结果加载到内存中并从该字符串编译程序集可能是最简单的。
正如你所看到的,这非常混乱,但现在它看起来是最可行的。我是否看过任何可能使这更容易的选项?
我正在创建一个库,该库将创建一个包含用户定义的类的程序集。这种方式的工作方式如下:
TinyTypeSetup
实例我现在想要添加的是用户可以创建自己的源文件并立即将这些文件添加到生成的程序集中。这将允许用户使用他自己的方法指定部分类,除了我自己生成的那些。
答案 0 :(得分:5)
您并不是在谈论CodeExpression有用的场景。它是一个源代码生成器,生成的特定类型的源代码由您选择的提供程序确定。
但是,您的项目用户在任何情况下都不会在您预想的用法中关注该语言。他从不看它,他从不自己编译。只有你关心,你必须选择正确的CodeCompiler。用户只选择它生成的组件。通过.NET约定,用于创建程序集的语言永远不重要。程序集中的元数据完全与语言无关。
CodeObjects在自动生成源代码并添加到用户项目的场景中非常有用。稍后,当用户构建他的项目时进行编译。很好的例子是Visual Studio中内置的各种设计器,如资源设计器和Winforms设计器。必要时,他们必须生成与用户的项目类型相匹配的代码。
如果你不需要,应该强烈避免。 CodeDom代码生成器的最大绊缩是它只能生成一种语言有效的语句子集。当然使用起来很难看,它会浪费你的代码。您只需要生成文本,您选择的语言并不重要。既然你似乎更喜欢C#,那就是你应该生成的那种文本。
考虑更大的解决方案。如果用户实际上可以在Visual Studio内部打开自定义设计器,那么它可能会更好。因此,这个额外的步骤,不再需要运行该翻译器从TinyType转换为程序集。易于使用,点亮IntelliSense也是如此。现在确实有意义生成代码。这需要做很多工作,创造设计师并不是那么简单。请密切注意球,没有用户会喜欢生成您需要的XML文件。在C#中创建微小类型已经很容易了,它不需要太多帮助。无论哪种方式,用户从你的小类型组成他自己的类型也不需要任何帮助。 VS已直接支持它。
答案 1 :(得分:0)
虽然有一点学习曲线。但肯定比自己处理字符串更好。调查潜在客户的.NET Compiler Platform (Roslyn)可能有所帮助,Overview to start with.
它提供了语义分析和转换API功能。诊断和代码修复功能。