将.Net Core作为DLL部署到IIS - 无法使用命令行'“dotnet”site.dll'启动进程

时间:2016-08-18 20:03:35

标签: asp.net-core iis-8

我有一个针对net461 Framework的.Net Core Web应用程序。它最初生成.EXE并在部署到IIS时工作正常。我想更改为便携式应用程序,因此我在ProjectJson中更改了“buildOptions”,如下所示:

"buildOptions": {
  "emitEntryPoint": false,
  "preserveCompilationContext": true,
  "debugType": "portable" 
},

现在,当我编译时,我得到一个DLL,它在IIS Express中运行良好,但是当我发布到IIS并将web.config aspnetcore元素更改为:

  <aspNetCore processPath="dotnet" arguments=".\myWebApp.dll" 
            stdoutLogEnabled="false" 
            stdoutLogFile=".\logs\stdout" 
            forwardWindowsAuthToken="false" />

项目无法运行,我在应用程序事件日志中看到“无法使用命令行启动进程”“dotnet”MyWebApp.dll“,ErrorCode ='0x80004005'”。

尝试从命令行运行“dotnet mywebapp.dll”会导致:

A fatal error was encountered. The library 'hostpolicy.dll' required to   
execute the application was not found in 'C:\inetpub\wwwroot\ETimeCore2'.

所以我找到并将hostpolicy.dll复制到该目录,现在得到:

Could not resolve CoreCLR path. For more details, enable tracing by setting 
CORE HOST_TRACE environment variable to 1

我确实将CORE HOST_TRACE设置为1并得到了所有正在加载的dll的详细响应,最后只有一个错误(上面),因此没有添加任何值。

知道我做错了什么?我更喜欢DLL到EXE,因为要在.EXE时发布更改,你必须首先回收应用程序池,这真的很痛苦。

1 个答案:

答案 0 :(得分:2)

如果禁用“emitEntryPoint”,则无法使用dotnet mywebapp.dll

emitEntryPoint表示项目是控制台应用程序还是库。来自sources

if (framework.IsDesktop() && compilerOptions.EmitEntryPoint.GetValueOrDefault())
{
   OutputExtension = FileNameSuffixes.DotNet.Exe;
}

在您的情况下,framework.IsDesktop()为真,因为您的目标框架是net461,即.NET Framework,而不是.NET Core。如果启用.exe,那么您可以获得emitEntryPoint作为输出。

实际上错误“在”中找不到执行应用程序所需的库'hostpolicy.dll'意味着以下内容(请参阅http://github.com/dotnet/cli/issues/2859问题):

  

dotnet.exe找不到mywebapp.dll中的入口点