C# 创建条件NuGet包

C# 创建条件NuGet包,c#,.net,vb.net,powershell,nuget,C#,.net,Vb.net,Powershell,Nuget,我已经在c#中创建了一个自定义程序集,它将被许多不同的现有系统使用,让这个程序集与我们的系统一起工作涉及到很多配置,因此为了使事情更简单,我们决定创建一个本地NuGet服务器,并将该程序集滚动到一个NuGet包中 这非常有效,我们能够添加程序集所需的所有依赖项,并添加一个web.config.transform文件以合并到所需的任何其他节点中 这是我们遇到的第一个绊脚石 首先,正如我前面提到的,程序集是用c#编写的,我们正在测试运行的应用程序是用VB.Net编写的。当我们在程序集中使用log4n

我已经在c#中创建了一个自定义程序集,它将被许多不同的现有系统使用,让这个程序集与我们的系统一起工作涉及到很多配置,因此为了使事情更简单,我们决定创建一个本地NuGet服务器,并将该程序集滚动到一个NuGet包中

这非常有效,我们能够添加程序集所需的所有依赖项,并添加一个web.config.transform文件以合并到所需的任何其他节点中

这是我们遇到的第一个绊脚石

首先,正如我前面提到的,程序集是用c#编写的,我们正在测试运行的应用程序是用VB.Net编写的。当我们在程序集中使用
log4net
时,我们已经实现了
webActivatex
,以确保它在应用程序启动时被初始化,这意味着我们有一个
AppStart
类,它位于
App\u Start
文件夹中。然而,参考
WebActivatorEx
文档后,我们注意到,如果项目是网站,则
AppStart
类必须位于
App\u code
文件夹中,而不是
App\u Start
文件夹中,并且必须使用
应用程序启动后方法
而不是
应用程序启动前方法

另外,由于
AppStart
类是用c#编写的,并且将位于一个VB.Net项目中,因此,只有当目标项目是VB时,我们才需要将其转换为VB,以避免与更多配置文件混淆,这是我们试图最小化的

简而言之,这里的主要问题是:

1.)我们的NuGet包是否具有某种条件行为,即,如果是VB.Net项目,请在VB.Net中添加
AppStart
类,如果是C,则将其保留为C

2.)如果项目是一个网站,将此
AppStart
类放入
App\u code
文件夹并使用
PostApplicationStartMethod
,如果项目是一个web应用程序,将
AppStart
类放入
appu Start
文件夹并使用
PreApplicationStartMethod

3.)就初始化log4net而言,这是否是正确的方法,而无需重新编写目标应用程序的global.asax

4.)我知道您可以在NuGet软件包中运行PowerShell命令,是否可以使用它来确定项目是C#| | | VB还是我在使事情复杂化,是否应该为每个场景创建4个不同的NuGet软件包,但这似乎是完全错误的


我将等待并欢迎任何建议或意见。

听起来您需要利用NuGet中的Init.ps1和Install.ps1支持。从他们的:

  • Init.ps1在解决方案中首次安装包时运行
  • Install.ps1在项目中安装包时运行。
    • $project是对EnvDTE项目对象的引用,表示安装包的项目
您应该能够使用这些脚本,特别是特殊变量
$project
,来确定要将软件包安装到的项目类型,并对项目代码进行适当的调整。您还可以在Package Manager控制台中使用helper cmdlet
Get Project
,获取对将传递到Install.ps1脚本的对象的引用。这将有助于查看不同的属性并建立条件逻辑

例如:

PM> $p = Get-Project
PM> $p.Type
C#

参考资料:

假设用户没有修改appstart代码,您可以将appstart代码放入已编译的程序集中,这样可以避免vb.net与c#


我也不确定为什么需要使用PostApplicationStart和PreApplicationStart。这并不是网站和Web应用程序之间固有的区别,您可能需要更深入地了解这一点。这可能是您的特定网站实现中的一个排序问题。

我认为OP指的是您不能在网站中使用
PreApplicationStartMethod
,因为当该方法发生火灾时,
App\u code
文件夹甚至还没有编译<代码>https://github.com/davidebbo/WebActivator但是,OP需要考虑一下,在这一点上确实需要in> <代码> Log4NET。具体来说,我的意思是编译的程序集并不重要。这是一个非常好的观点@generalexceptionAh fair point,因此,由于程序集已经编译,那么PreApplicationStartMethod仍然可以正常工作?是的,这正是Razor使用注册语句获得默认值的方式。很明显,它适用于网站场景。