6

Bir MsBuild Task: MyTask yazdım. Benim çözümümde, Görev projem ve diğer projelerim var. MyTask, üçüncü meclislere atıfta bulunan bir projeye (Proj1) atıfta bulunur (dep1 ve dep2).MsBuild, özel görevin ikinci düzey bağımlılıkları için iyi dizine bakmıyor

Tüm projeler iyi bir şekilde oluşturulur ve çıktıları bir dizinde (Compil) alır. Bu dizinde ben istediğim tüm dll var: MyTask.dll, ProjA.dll, dep1.dll, dep2.dll ve diğerleri.

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

Sonra MyTask düzeneğinin görevi diyoruz: Benim MsBuild dosyasında

i ile özel görev montaj dahil. Çağrı de idam fakat (aynı dizinde olmasına rağmen) MsBuild DEP1 ve DEP2 meclisleri görmediklerine hakkında şikayet edilir:

hatası: dosya veya derleme yüklenemedi 'DEP1 = 2.0.0.0, Culture, Sürüm = neutral, PublicKey Token = 9109c11469ae1bc7 'veya bağımlılıklarından biri. Sistem belirtilen dosyayı bulamıyor.

Ben dep1.dll kopyalayarak bu sorunu çözmek ve c dep2.dll edebilirsiniz: microsoft .net \ framework \ v4.0 \ \ \ pencereleri ama sorunları olduğunda tetikler çünkü bunu yapmak istemiyorum diğer projeler inşa (dep1.dll ve dep2.dll çıktı dizinine kopyalamaz ...).

Aynı sorun veya daha iyi bir çözümü olan var mı?


DÜZENLEME İşte

Fusion Günlük Görüntüleyici

*** 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. 

çıkışı olan Ve bütün dll nerede olduğunu dizinde MSBuild.exe kopyalarsanız, iyi çalışıyor ..
MsBuild, Componenter dizinindeki dep1.dll ve dep2.dll dosyasını aramıyor gibi görünmüyor ... (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)


DÜZENLEME benim bağlamaları yapılır nasıl gelince

:

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

ProjA

<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

olası yinelenen [aynı çözeltisinden Kullanım özel MSBuild görevler?] (Http://stackoverflow.com/questions/282615/use-custom-msbuild-tasks-from-the-same-solution –

+0

Hayır. Bağladığın konuyu gördüm. Durumunda, msbuild görev düzeneğini yükleyemez çünkü yol iyi değil. Benim durumumda, görev iyi yüklenir, ilk bağımlılık (ProjA) da ancak 2. düzey bağımlılıklar (dep1 ve dep2) değildir. –

+0

Bu soruna * uygun * bir çözüm buldunuz mu? Sanırım şu anda aynı problemim var. – theDmi

cevap

2

Olabilir iki bağımlılıkları başvuruyor: MyTask tarafından ProjA Projesi başvuruyor Hangi yolların sear olduğunu görmek için Fusion Log Viewer'ı (VisualStudio ile kurulan fuslogvw.exe) deneyin. meclisler için ched. Bunun yerine kullanılabilecek başka bir klasör bulabilirsiniz.

Eğer dep1 ve dep2 üçüncü parti meclisleri ya da değişmeyecek dahili isimler ise, bunları her zaman GAC'ye atabilirsiniz. Bu genellikle bir derleme sunucusundan kaçındığım bir şeydir, ancak bunları yalnızca yapım yardımcıları oluşturmak için değil, üretim yüklemeleri için kullanıyorsanız, bir sorun olmamalıdır.

Düzenleme: partial bind nedeni olabilir. ProjA'yı kullanmak için Assembly.Load kullanıyor musunuz?Sağladığınız günlüklerden, ProjA'nın yüklenememesi gibi görünüyor - dep1 veya dep2'yi yüklemeyi bile denemeyecek kadar uzağa gitmiyor.

+0

Fusion Log Viewer'ı denemeyi deneyeceğim, bu da microsoft.csharp.targets adresindeki yorumlardan daha somut bir sonuç verecektir. GAC'a gelince, dep1 ve dep2 yapmakta olduğumuz Projeler, bu yüzden dll'ler değişiyor. Bu yüzden msbuilddir'e elle kopyalamayı ve sonra onları silmeyi tercih ediyorum ... –

+0

Yardımlarınız için teşekkürler. Yazımı, bağlayıcı yapılandırmalarımla düzenledim. Montajları kodla değil, yalnızca yapılandırma yoluyla yüklemiyorum. Günlüğün, MSBUild hata iletisiyle tutarlı olan Projeyi (aslında dep1 ve dep2 bağımlılıkları) TAMAMAYI yükleyemediğini düşünüyorum: "Dosya veya derleme yüklenemedi" dep1, Sürüm = 2.0.0.0, Culture = neutral, PublicKey Token = 9109c11469ae1bc7 '" –

+0

Size ödül verdim, çünkü Pedro bana en çok yardım ettiniz, ama hala cevabım yok:' (. Teşekkürler, Pedro. –

0

Sizi alabileceğim birkaç iş var.

  1. ILMerge bu tek derleme birlikte birkaç Kurullara birleştirme sağlayacaktır.

  2. Kullanmıyor olsanız bile ikincil referans noktasını çözümünüze ekleyebilirsiniz, bu dosyayı bin klasörünüze kopyalar.

  3. klasörün

bu yardımcı olur Umut eksik Meclisi kopyalamak için derleme sonra çalıştırmak için başka Target oluşturmak.

Iain

+0

ILMerge'ı biliyorum ve sorunu çözebilirim.Ama ben sadece son seçenekte kullanacağım (MSBuild.exe'yi dizine kopyalamayı bile tercih edebilirim). 2 ve 3 seçeneklerine gelince: dosyalar çıktı klasöründedir, özel olarak işaretlenirler (VS'de copylocal) ve her şey yolundadır.Bunu birkaç kez C# dll projeleri ile zarar vermeden yaptım.Ama bir MSBuild Custom Task, MSBuild Curren'de ikinci seviye meclisleri aramıyor gibi görünüyor t dizini ... –

+0

Bununla hiç ilerleme kaydettiniz mi? Yaklaşık 7 yıl sonra aynı sorunu yaşıyorum! (Https://stackoverflow.com/questions/44976387/how-do-i-make-msbuild-find-net-assemblies-when-using-a-custom-task-usingtask). Ben de ILMerge'i deneyeceğim. VS2015 ve Msbuild 14.0 kullanıyorum. –