Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows服务可以';t在释放时加载DLL_C#_.net_Windows Services - Fatal编程技术网

C# Windows服务可以';t在释放时加载DLL

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自托

这有点奇怪,过去一周我一直绞尽脑汁想弄明白这一点

我有一个windows服务,它将作为一个新的站点启动器(内部工具)。我在解决方案中有5个项目:

  • IISWrapper(.2.0版净标准)
  • SiteLauncher(这是服务项目)(.NETFramework 4.7)
  • 调试(用于调试web界面的控制台应用程序)(.NETFramework 4.7)
  • 操作(.NETFramework 4.7)
  • SiteLauncher.WebUI(.NET Framework 4.7)
我使用NancyFx自托管作为web界面。所有5个项目都是使用VisualStudio中设置的x86体系结构构建的。IISWrapper引用了Micorosft.Web.Administration,它是.NET核心,因此它必须是服务使用它的.NET标准

这一切都有效。只要服务是在调试中构建的。如果我将其切换到Release,当它尝试与IIS交互时会出现如下错误:

无法加载文件或程序集“System.Diagnostics.TraceSource,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。(来自HRESULT的异常:0x8013100)

NewSiteSetup.cs第303行是使用语句的

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();
}