是否可以在Visual Studio中编译之前立即添加C#类

时间:2015-06-17 06:20:43

标签: c# visual-studio compilation roslyn

现在我以编程方式生成源代码并在编译之前创建一些类,显然将它添加到解决方案中的项目中。也许有可能"默默地"在编译之前添加类而不在磁盘中创建.cs文件,而不在解决方案资源管理器中显示这些类(可能使用Roslyn)。

编辑:我不能使用任何运行时代码生成。

3 个答案:

答案 0 :(得分:0)

您可以将类放在单独的DLL(类库)中。使用其他解决方案创建该DLL时,您将看不到包含它们的项目的解决方案资源管理器中的类。

不要忘记在主项目中添加对DLL(类库)的引用。

答案 1 :(得分:0)

您可以使用MSBuild做一些事情,创建一个自定义项目目标来完成工作,但我从未这样做过。

我最近在基于DNX的ASP.NET 5平台上可以实现的是一种称为元编程的概念。我已经编写了一个关于这个概念的blog article,特别是在编译时生成代码的例子。在我的特定示例中,我有一个无法编译的类,但随后引入了ICompileModule,我可以在编译时填写缺少的方法return语句。

这是可能的,因为在基于DNX的应用程序中,RoslynCompiler类实际上支持在编译时加载ICompileModule的实例,然后在主项目编译之前运行这些实例。这使您可以在编译器完成其工作之前在编译中添加/删除/替换语法树。

如果你想在ASP.NET 5上进行开发,这个可以使你能够做你需要的,但我不知道你会怎么做呢。

对我来说似乎非常 aspecty

我问了一个问题,我也回答了自己关于设计一个编译时解决方案的问题,该解决方案为另一个场景执行代码生成:

Getting interface implementations in referenced assemblies with Roslyn

最后,其他可能有用的示例,以及我一直在讨论的内容,是能够从我的程序集中嵌入的.sql文件生成EF样式的迁移类。现在,我可以更轻松地在ASP.NET 5 + Roslyn上实现所有这些场景。

答案 2 :(得分:0)

在不知道你的用例的情况下,这是一个想法...

创建一个侦听'on build'事件的VSIX

初始化构建时,VSIX会创建新类*

同样的VSIX也会监听“构建完成”事件

完成构建后,VSIX将拆除新类

*您的问题表明不应在光盘上创建类,因此VSIX可以

  • 将类创建为内存流(?)

  • 将新类添加为光盘上现有文件中的代码

  • 在C:\ Temp或其他地方的光盘(或云?)上创建新类作为新文件

  • 新类可以是部分类的一部分(应用程序中的实际分部类或空的新虚拟分部类)

在任何情况下,都需要自动编辑项目文件(由vsix)以引用新文件。大概你想让项目文件还原吗?

如果,与我不同,你想要堕落和肮脏,你可以随时干扰IL,但你自己就在那里!

正如TarkaDaal所说,在不知道为什么需要这个的情况下,提供更具说法性的答案并不容易。