2017-06-08 156 views
0

在使用dotnet構建的Microsoft Build Task中是否可以使用軟件包引用(如Microsoft.CodeAnalysis)?如何在dotnet中的任務中訪問軟件包引用

我使用netstandard1.5的任務庫和下面的包的引用:

<PackageReference Include="Microsoft.Build" Version="15.3.0-preview-000117-01" /> 
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.3.0-preview-000117-01" /> 
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="2.2.0" /> 

的消費項目是netcoreapp1.1。該任務將失敗,並

The "MyTask" task failed unexpectedly. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.CodeAnalysis, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. File name: 'Microsoft.CodeAnalysis, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

例外。

當試圖通過AssemblyLoadContext.Default.LoadFromAssemblyPath加載裝基準我得到

Could not load file or assembly 'Microsoft.CodeAnalysis, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

沒有任何額外的信息。在.net核心控制檯應用程序中運行時也不起作用。我嘗試了第二個(更簡單的)程序包,它可以通過.net核心控制檯應用程序中的LoadFromAssemblyPath加載,但在以dotnet生成任務運行時仍不起作用。

這兩個程序集都可以在經典的net4.6中運行,在控制檯應用程序中運行時爲Assembly.LoadFile,並且在運行時儘管是Task。

回答

1

不幸的是,任務dll無法引用任何包 - 它們被加載到正在運行的msbuild實例中,並且只能引用可用於宿主msbuild實例的dll。任何其他的DLL可以通過.net核心中的AssemblyLoadContext或者.net框架中的AppDomain.Load()加載。對任務的dll文件不執行依賴關係解析,這也意味着可能與已加載的dll,msbuild的不同部分或其他任務發生衝突。在.NET Framework MSBuild中,任務可以獨立於自己的AppDomain,但是這種機制在.NET Core上不可用。

+0

感謝您的回答。我修改我的問題是更通用的。任何想法爲什麼'AssemblyLoadContext.Default.LoadFromAssemblyPath'作爲dotnet構建任務運行時不起作用? – Dresel

相關問題