现在我以编程方式生成源代码并在编译之前创建一些类,显然将它添加到解决方案中的项目中。也许有可能"默默地"在编译之前添加类而不在磁盘中创建.cs文件,而不在解决方案资源管理器中显示这些类(可能使用Roslyn)。
编辑:我不能使用任何运行时代码生成。
答案 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所说,在不知道为什么需要这个的情况下,提供更具说法性的答案并不容易。