C# Windows服务可以';t在释放时加载DLL
这有点奇怪,过去一周我一直绞尽脑汁想弄明白这一点 我有一个windows服务,它将作为一个新的站点启动器(内部工具)。我在解决方案中有5个项目:C# Windows服务可以';t在释放时加载DLL,c#,.net,windows-services,C#,.net,Windows Services,这有点奇怪,过去一周我一直绞尽脑汁想弄明白这一点 我有一个windows服务,它将作为一个新的站点启动器(内部工具)。我在解决方案中有5个项目: IISWrapper(.2.0版净标准) SiteLauncher(这是服务项目)(.NETFramework 4.7) 调试(用于调试web界面的控制台应用程序)(.NETFramework 4.7) 操作(.NETFramework 4.7) SiteLauncher.WebUI(.NET Framework 4.7) 我使用NancyFx自托
- IISWrapper(.2.0版净标准)
- SiteLauncher(这是服务项目)(.NETFramework 4.7)
- 调试(用于调试web界面的控制台应用程序)(.NETFramework 4.7)
- 操作(.NETFramework 4.7)
- SiteLauncher.WebUI(.NET Framework 4.7)
:
Console.WriteLine($"{DateTime.Now:g}: Creating website...");
using (IISManager manager = new IISManager())
{
manager.CreateAppPool(ev.Site.DomainName, ev.DbName, userPass);
Directory.CreateDirectory($@"C:\inetpub\{ev.Site.DomainName}");
manager.CreateWebsite(ev.Site.DomainName, $@"C:\inetpub\{ev.Site.DomainName}");
}
IISManager.CreateAppPool
方法:
public void CreateAppPool(string appPoolName, string userName, string password, long memoryLimit = 200000)
{
ApplicationPool pool = _manager.ApplicationPools.Add(appPoolName);
pool.Enable32BitAppOnWin64 = true;
pool.Recycling.PeriodicRestart.PrivateMemory = memoryLimit;
pool.Cpu.Action = ProcessorAction.NoAction;
pool.Cpu.Limit = 30000;
pool.Failure.RapidFailProtectionMaxCrashes = 10;
pool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
pool.ProcessModel.UserName = userName;
pool.ProcessModel.Password = password;
pool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
_manager.CommitChanges();
}
我已验证输出文件夹中是否存在此库。奇怪的是,我在发布的控制台应用程序项目中也得到了这个。我不知道有什么区别
我已验证服务和控制台应用程序中是否安装了相同的软件包。两者似乎都在调试模式下工作,但在发布模式下失败
服务类别:
公共部分类SiteLauncher:ServiceBase
{
南昌酒店(主机),;
公共站点启动器()
{
初始化组件();
}
启动时受保护的覆盖无效(字符串[]args)
{
_主机=新NancyHost(新Uri(“http://localhost:9664"));
_host.Start();
WebEvents=新的WebEvents();
events.SiteCreated+=事件\u SiteCreated;
Bootstrapper.webEvents=事件;
}
私有无效事件\u SiteCreated(对象发送方,SiteCreatedEventArgs e)
{
初始化(e);
}
受保护的覆盖void OnStop()
{
_host.Stop();
}
}
控制台应用程序.cs:
类程序
{
静态void Main(字符串[]参数)
{
var nancyHost=新nancyHost(新Uri(“http://localhost:9664"));
nancyHost.Start();
Console.WriteLine(“在上运行的Web服务器http://localtest.me:9664...");
WebEvents=新的WebEvents();
events.SiteCreated+=事件\u SiteCreated;
Bootstrapper.webEvents=事件;
Console.ReadLine();
nancyHost.Stop();
}
私有静态无效事件\u SiteCreated(对象发送方,SiteCreatedEventArgs e)
{
WriteLine($“{DateTime.Now:g}:Site{e.Site.DomainName}(ID:{e.Site.ID})已创建,Repo:{e.Repository}”);
初始化(e);
}
}
有什么想法吗?Microsoft.Web.Administration的NuGet版本是为IIS管理REST API设计的。请改用本地IIS附带的版本
有关详细信息,请参见。是否尝试删除未使用的程序集引用?是的,我检查了所有项目,并确保只引用了所需的程序集。它是否与#ifdebug宏有关?我使用的是#if!调试
,以确定连接字符串使用哪个IP地址。但这一切都会过去的。您可以尝试关闭解决方案,删除.suo文件,然后重新打开解决方案,然后再试一次。谢谢。正如我所说,在我之前的搜索中没有出现过类似的情况。这很有帮助。
public void CreateAppPool(string appPoolName, string userName, string password, long memoryLimit = 200000)
{
ApplicationPool pool = _manager.ApplicationPools.Add(appPoolName);
pool.Enable32BitAppOnWin64 = true;
pool.Recycling.PeriodicRestart.PrivateMemory = memoryLimit;
pool.Cpu.Action = ProcessorAction.NoAction;
pool.Cpu.Limit = 30000;
pool.Failure.RapidFailProtectionMaxCrashes = 10;
pool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
pool.ProcessModel.UserName = userName;
pool.ProcessModel.Password = password;
pool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
_manager.CommitChanges();
}