我们可以同时从CodeExpressions和文字源代码构造一个程序集吗?

Jer*_*vel 7 c# code-generation codedom .net-assembly

我有一种情况,我的代码的一部分是CodeExpressions由用户自己生成的,另一部分是由用户自己生成的(例如:用户只需像往常一样编写代码,然后我会在编译时将其添加到我的程序集中).

是否可以生成包含这两个项目的程序集?警告:这两种方法将包含partial类,因此它们必须位于同一个程序集中.

我想到的另一种方法是将这两种方法转换为字符串表示,然后从该字符串生成程序集,但我怀疑我可以从用户生成的类型中获取源代码(在编译时).

根据这个想法,我可以将CodeExpressions生成的代码写入文本文件并将其与.cs文件结合起来.时间表看起来像这样:

  • 用户写了他的课
  • CodeDom树以编程方式设置
  • 用户构建项目
  • CodeDom生成文本文件的源
  • 程序读取用户定义.cs文件的内容
  • 程序读取生成的文本文件
  • 程序结合了这两个
  • 程序.dll从组合源代码中创建一个新的

我可以跳过将我生成的CodeDom源写入和读取文本文件的(冗余)步骤,并简单地将其写入内存,当然.事实上,使用预处理T4模板并将这些模板的结果加载到内存中并从该字符串编译程序集可能最简单.

正如你所看到的,这是非常混乱的,但现在它看起来是最可行的.我是否看过任何可能使这更容易的选项?

背景:

我正在创建一个库,该库将创建一个包含用户定义的类的程序集.这种方式的工作方式如下:

  • 用户在他的项目中引用我的库
  • 用户创建新TinyTypeSetup实例
  • 用户为其添加了Tiny Type定义
  • 用户运行程序
  • 程序通过CodeDom从给定类型生成程序集

我现在想要添加的是用户可以创建自己的源文件并立即将这些文件添加到生成的程序集中.这将允许用户使用他自己的方法指定部分类,除了我自己生成的那些.

Han*_*ant 5

您不是在谈论CodeExpression有用的场景.它是一个源代码生成器,生成的特定类型的源代码由您选择的提供程序确定.

但是,您的项目用户在任何情况下都不会在您预想的用法中关注该语言.他从不看它,他从不自己编译.只有你关心,你必须选择正确的CodeCompiler.用户只选择它生成的组件.通过.NET约定,用于创建程序集的语言永远不重要.程序集内的元数据完全与语言无关.

CodeObjects在自动生成源代码并添加到用户项目的场景中非常有用.稍后,当用户构建他的项目时进行编译.很好的例子是Visual Studio中内置的各种设计器,如资源设计器和Winforms设计器.必要时,他们必须生成与用户的项目类型匹配的代码.

如果您不需要它,应该强烈避免.CodeDom代码生成器的最大绊缩是它只能生成一种语言有效的语句子集.当然使用起来很难看,它会浪费你的代码.您只需要生成文本,您选择的语言无关紧要.既然你似乎喜欢C#,那就是你应该生成的那种文本.

考虑更大的解决方案.如果用户实际上可以在Visual Studio内部打开自定义设计器,那么它可能会工作得更好.所以这个额外的步骤,不再需要运行该转换器从TinyType转换为程序集.易于使用,点亮IntelliSense也是如此.现在生成代码确实有意义.这将需要很多工作,创建设计师并不是那么简单.请密切注意球,没有用户会喜欢生成您需要的XML文件.在C#中创建微小类型已经很容易了,它不需要太多帮助.无论哪种方式,用户从你的小类型组成他自己的类型也不需要任何帮助.VS已经直接支持它了.