我已经在c#中创建了一个自定义程序集,它将被许多不同的现有系统使用,有很多配置涉及使这个程序集与我们的系统一起使用,以便使事情变得更容易,我们决定创建一个本地NuGet服务器并将程序集滚动到NuGet包中。
这非常有效,我们能够添加程序集所需的所有依赖项,并添加web.config.transform文件以合并到所需的任何其他节点中。
这是我们遇到第一个绊脚石......
首先,正如我之前提到的,程序集是用c#编写的,我们测试运行的应用程序是用VB.Net编写的。当我们在程序集中使用log4net
时,我们已经实现了WebActivatorEx
以确保在应用程序启动时初始化,这意味着我们有一个AppStart
类,它位于App_Start
文件夹中。但是,在参考WebActivatorEx
文档后,我们注意到如果项目是网站与网络应用程序相关联,AppStart
类必须参加在App_Code
文件夹内而不是App_Start
文件夹中,还必须使用PostApplicationStartMethod
而不是PreApplicationStartMethod
。
同样由于AppStart
类是用c#编写的,并且将位于VB.Net项目中,我们需要将此转换为VB,如果目标项目是VB,以避免弄乱更多配置文件,这是我们的事情正在努力减少。
简而言之,这里的主要问题是:
1.。)我们的NuGet包可以有某种条件行为,即如果它的VB.Net项目在VB.Net中添加AppStart
类,如果它的C#,则离开它是C#。
2。)如果项目是网站,则将此AppStart
类放在App_Code
文件夹中并使用PostApplicationStartMethod
,如果项目是Web应用程序,则{{1}在AppStart
文件夹中使用App_Start
。
3。)在初始化log4net而不重写目标应用程序的global.asax
时,这是否是正确的方法4.。)我知道你可以在NuGet包中运行PowerShell命令,无论如何使用它来确定项目是否是C#|| VB或者我是复杂的事情,我应该为每个场景创建4个不同的NuGet包,但这似乎是完全错误的。
我将等待并欢迎任何建议或意见。
答案 0 :(得分:3)
假设用户没有修改appstart代码,你可以将appstart代码放在已编译的程序集中,这样可以避免使用vb.net与c#。
我也不确定为什么需要使用PostApplicationStart与PreApplicationStart。这不是Web站点与Web应用程序之间的固有差异,您可能希望深入了解这一点。它可能是您特定网站实施中的订购事项。
答案 1 :(得分:2)
听起来你需要利用NuGet中的Init.ps1和Install.ps1支持。来自documentation:
您应该能够使用这些脚本,特别是特殊变量$project
来确定要安装软件包的项目类型,并对项目代码进行适当的调整。您还可以使用程序包管理器控制台中的帮助程序cmdlet Get-Project
来获取将传递给Install.ps1脚本的EnvDTE对象的引用。这应该有助于查看不同的属性并构建条件逻辑。
例如:
PM> $p = Get-Project
PM> $p.Type
C#
参考:http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#powershell