我有一个针对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时发布更改,你必须首先回收应用程序池,这真的很痛苦。
答案 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中的入口点