6

Ho scritto un MsBuild Task: MyTask. Nella mia soluzione, ho il progetto Task e altri progetti. MyTask fa riferimento a un progetto (ad esempio ProjA) che fa riferimento a terzi assiemi, ad esempio (dep1 e dep2).MsBuild non appare nella directory corretta per le dipendenze di secondo livello delle attività personalizzate

I progetti tutto funziona bene e ho gli output in una directory (Compil). In questa directory ho tutte le DLL che voglio: MyTask.dll, ProjA.dll, dep1.dll, dep2.dll e altri.

Nel mio file MsBuild includo l'assembly attività personalizzato con:

<UsingTask AssemblyFile="..\Compil\MyTask.dll" TaskName="CreateSitesCss" /> 

Poi io chiamo un compito dell'assemblea MyTask. La chiamata è ben eseguito, ma MsBuild lamenta di non trovare le assemblee dep1 e dep2 (anche se sono nella stessa directory):

errore: Impossibile caricare il file o l'assembly 'dep1, Version = 2.0.0.0, Culture = neutro, Token PublicKey = 9109c11469ae1bc7 'o una delle sue dipendenze. Il sistema non trova il file specificato.

posso risolvere questo problema copiando dep1.dll e dep2.dll in c: \ windows \ Microsoft .NET \ Framework \ v4.0 \ ma non voglio fare questo perché si innesca problemi quando costruzione di altri progetti (non copierà dep1.dll e dep2.dll nella directory di output ...).

Qualcuno ha lo stesso problema, o meglio, una soluzione?


EDIT

Ecco l'output di Fusion Log Viewer

*** Assembly Binder Log Entry (19/10/2010 @ 17:52:45) *** 

The operation failed. 
Bind result: hr = 0x80070002. The system cannot find the file specified. 

Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\clr.dll 
Running under executable c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = HEADOFFICE\bbaumann 
LOG: DisplayName = ProjA 
(Partial) 
WRN: Partial binding information was supplied for an assembly: 
WRN: Assembly Name: ProjA | Domain ID: 1 
WRN: A partial bind occurs when only part of the assembly display name is provided. 
WRN: This might result in the binder loading an incorrect assembly. 
WRN: It is recommended to provide a fully specified textual identity for the assembly, 
WRN: that consists of the simple name, version, culture, and public key token. 
WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue. 
LOG: Appbase = file:///c:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/ 
LOG: Initial PrivatePath = NULL 
LOG: Dynamic Base = NULL 
LOG: Cache Base = NULL 
LOG: AppName = MSBuild.exe 
Calling assembly : System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe.Config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
WRN: Not probing location file:///d:/svn/twilight/_build/ProjA.DLL, because the location falls outside of the appbase. 
WRN: Not probing location file:///d:/svn/twilight/_build/ProjA/ProjA.DLL, because the location falls outside of the appbase. 
WRN: Not probing location file:///d:/svn/twilight/_build/ProjA.EXE, because the location falls outside of the appbase. 
WRN: Not probing location file:///d:/svn/twilight/_build/ProjA/ProjA.EXE, because the location falls outside of the appbase. 
LOG: Attempting download of new URL file:///c:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/ProjA.DLL. 
LOG: Attempting download of new URL file:///c:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/ProjA/ProjA.DLL. 
LOG: Attempting download of new URL file:///c:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/ProjA.EXE. 
LOG: Attempting download of new URL file:///c:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/ProjA/ProjA.EXE. 
LOG: All probing URLs attempted and failed. 

E Se copio MSBuild.exe nella directory in cui tutta la mia dll sono, funziona benissimo ..
MsBuild non sembra cercare dep1.dll e dep2.dll nella mia directory Compil anche se trova ProjA.dll entro ...


EDIT

Quanto a come i miei attacchi sono fatti: MyTask fa riferimento al Progetto proja da:

<ProjectReference Include="..\ProjA\ProjA.csproj"> 
    <Project>{ED61DCC3-D759-4D44-B802-A6A46F328402}</Project> 
    <Name>ProjA</Name> 
</ProjectReference> 

proja fa riferimento ai due dipendenze da

<Reference Include="dep1, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\Dependencies\dep1\dep1.dll</HintPath> 
</Reference> 
<Reference Include="dep2, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\Dependencies\dep2\dep2.dll</HintPath> 
</Reference> 
+0

possibile duplicato del [compiti Usa personalizzato MSBuild dalla stessa soluzione?] (Http://stackoverflow.com/questions/282615/use-custom-msbuild-tasks-from-the-same-solution) –

+0

No. Avevo visto l'argomento che linkavi. Nel suo caso, msbuild non può caricare l'assembly del task perché il percorso non è buono. Nel mio caso, l'attività è ben caricata, anche la prima dipendenza (ProjA) ma le dipendenze di secondo livello (dep1 e dep2) non lo sono. –

+0

Hai mai trovato una soluzione * corretta * a questo problema? Penso di avere lo stesso problema adesso. – theDmi

risposta

2

Potrebbero prova Fusion Log Viewer (fuslogvw.exe, installato con VisualStudio) per vedere quali percorsi sono in corso ched per le assemblee. Potresti trovare un'altra cartella che può essere usata al suo posto.

Se dep1 e dep2 sono gruppi di terze parti o interni che non cambieranno, è sempre possibile inserirli nel GAC. Questo è qualcosa che generalmente evito su un server di build, ma se li si utilizza solo per build helper e non per installazioni di produzione, non dovrebbe essere un problema.

Modifica: il partial bind potrebbe essere la causa. Stai usando Assembly.Load per usare ProjA?Dai log che hai fornito, sembra che non riesca a caricare ProjA - non è abbastanza lontano da provare nemmeno a caricare dep1 o dep2.

+0

Proverò a Fusion Log Viewer questo darà un risultato più concreto rispetto ai commenti di microsoft.csharp.targets. Per quanto riguarda GAC, dep1 e dep2 sono progetti che stiamo facendo, quindi le DLL cambiano. Ecco perché preferisco copiarli a mano su msbuilddir e cancellarli successivamente ... –

+0

Grazie per il tuo aiuto. Ho modificato il mio post con le mie configurazioni vincolanti. Non carico gli assembly per codice ma solo per configurazione. Penso che il log non riesca a caricare COMPLETAMENTE ProjA (in effetti le dipendenze dep1 e dep2) che è coerente con il messaggio di errore MSBUild: "Impossibile caricare file o assembly 'dep1, Version = 2.0.0.0, Culture = neutral, PublicKey Token = 9109c11469ae1bc7 '" –

+0

Ti do la ricompensa Pedro perché mi hai aiutato di più, ma non ho ancora la mia risposta:' (Grazie, Pedro, –

0

Ci sono un paio di soluzioni che potrei immaginare.

  1. ILMerge questo vi permetterà di unire più Assemblee insieme, in un unico assemblaggio.

  2. È possibile aggiungere la soluzione secondaria alla soluzione anche se non la si utilizza, questa operazione verrà copiata nella cartella bin.

  3. creare un'altra destinazione per eseguire dopo la compilazione di copiare l'Assemblea mancante nella cartella

Spero che questo aiuti.

Iain

+0

Conosco ILMerge e potrebbe risolvere il problema, ma lo userò solo nell'ultima opzione (potrei anche preferire copiare MSBuild.exe nella directory). Per quanto riguarda le opzioni 2 e 3: i file si trovano nella cartella di output, sono contrassegnati come privati ​​(copylocal in VS) e tutto è a posto, l'ho fatto più volte con i progetti di C# dll senza problemi. Ma con un MSBuild Custom Task, MSBuild non sembra cercare gli assembly di secondo livello nel curren t directory ... –

+0

Hai mai fatto progressi con questo? Sto avendo lo stesso problema quasi 7 anni dopo! (Https://stackoverflow.com/questions/44976387/how-do-i-make-msbuild-find-net-assemblies-when-using-a-custom-task-usingtask). Ho intenzione di provare anche ILMerge. Sto usando VS2015 e Msbuild 14.0. –