2017-06-08 3 views
0

Ist es möglich, Paketverweise wie Microsoft.CodeAnalysis innerhalb einer Microsoft Build Task zu verwenden, die mit dotnet build ausgeführt wird?Zugriff auf Paketreferenzen innerhalb einer Aufgabe für dotnet build

Ich verwende netstandard1.5 für die Task-Bibliothek und die folgenden Paket Referenzen:

<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" /> 

Das aufwändige Projekt ein netcoreapp1.1 ist. Die Aufgabe schlägt mit einer

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'

Ausnahme.

Beim Versuch, das Paket Referenz über AssemblyLoadContext.Default.LoadFromAssemblyPath zu laden ich

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

ohne weitere Informationen. Dies funktioniert auch nicht, wenn Sie in einer .net-Kernkonsolenanwendung ausgeführt werden. Ich versuchte ein zweites (einfacheres) Paket, das über LoadFromAssemblyPath in einer .net Kernkonsolenanwendung geladen werden kann, aber es funktioniert immer noch nicht, wenn es als dotnet build Task ausgeführt wird.

Beide Baugruppen können geladen werden, wenn sie in klassischen net4.6 mit Assembly.LoadFile in einer Konsolenanwendung und wenn als Task ausgeführt werden.

Antwort

1

Leider können Task-DLLs keine Pakete referenzieren - sie werden in die laufende msbuild-Instanz geladen und können nur auf die DLLs verweisen, die für die hosting-Msbuild-Instanz verfügbar sind. Beliebige andere DLLs könnten über AssemblyLoadContext in .net-Kern oder AppDomain.Load() in .net-Framework geladen werden. Für die DLL-Datei der Aufgabe wird keine Abhängigkeitsauflösung durchgeführt, dies bedeutet auch, dass möglicherweise Konflikte mit bereits geladenen DLLs, verschiedenen Teilen von Msbuild oder anderen Aufgaben auftreten. In .NET Framework MSBuild können Tasks für ihre eigenen AppDomains isoliert werden, aber dieser Mechanismus ist in .NET Core nicht verfügbar.

+0

Danke für Ihre Antwort. Ich habe meine Frage modifiziert, um generischer zu sein. Irgendeine Idee, warum 'AssemblyLoadContext.Default.LoadFromAssemblyPath' nicht funktioniert, wenn es als dotnet Build Task ausgeführt wird? – Dresel

Verwandte Themen