2013-03-04 13 views
5

Mamy pozornie wspólny błądskompilować NET 4.0 projekt na serwerze kompilacji z .net 4.5

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

w projekcie, który musi zostać skompilowany z .NET 4.0, ale jest zbudowany na uruchomionym serwerze kompilacji Windows Server 2012 (z .Net 4.5). Projekt jest aplikacją internetową, która zostanie wdrożona na serwerze sieciowym z 2003 r., Gdzie instalacja .Net 4.5 nie jest opcją. Nie działa przeciw "klasycznej" .Net 4.0

Z podobnymi pytaniami, próbujemy opcji wiersza polecenia do MSBuild:

/property:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 

Próbowaliśmy także różne kombinacje

/property:ReferencePath="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
/property:NoStdLib=true 
/property:NoCompilerStandardLib=true 

The zespoły referencyjne (w tym pliki .dll) są faktycznie instalowane w tym miejscu na serwerze kompilacji. Ale kiedy wdrażamy witrynę i odwiedzamy stronę główną, otrzymujemy ten błąd. (Co ciekawe, po ponownym wczytaniu strony błąd zniknie, a strona działa normalnie.) Jakie parametry MSBuild są potrzebne do kompilacji z zestawami .Net 4.0?

Aktualizacja Włączyłem rejestrowania niedorzeczne szczebla na MSBuild, i widzę, że widocznie jest budowanie przeciwko .NET 4.0 zespołów odniesienia:

Resolved file path is "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll 

i nie widzę żadnej wzmianki złożeń poza tym folderem lub katalogiem roboczym serwera kompilacji. Wygląda więc na to, że kompiluje się prawidłowo, ale po wdrożeniu na serwerze sieciowym zgłasza wyjątek.

Co do wyjątku odchodzącego po ponownym wczytaniu strony, zastanawiam się, czy jest to związane z etapem wstępnej kompilacji znaczników. Używamy aspnet_compile na serwerze kompilacji. Być może, jeśli wystąpi wyjątek pochodzący z wygenerowanego zespołu, serwer internetowy go skompiluje. A zrekompilowany zespół jest w porządku, ponieważ został stworzony z prawdziwym .Net 4.0.

+0

Czy używasz ILMerge? –

+0

Nie używamy ILMerge. –

+0

Zmień nazwę C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.dll na tym serwerze kompilacji i wykonaj czystą kompilację. Znajdziesz projekt, który używa niewłaściwych zestawów referencyjnych. –

Odpowiedz

3

Cóż, odpowiedź okazała się granicząca z zawstydzeniem. Po tym, jak potwierdziliśmy na podstawie szczegółowego wyniku MSBuild, że faktycznie budowaliśmy projekt strony internetowej na właściwych zestawach referencyjnych, zdaliśmy sobie sprawę, że istnieje kilka wewnętrznych pakietów NuGet w projekcie, który został zbudowany na platformie .Net 4.5. Jednym z nich był klin pełen metod rozszerzenia, co powoduje wyjątek. Przebudowanie ich przeciwko .Net 4.0 naprawiło problem.

Co wywołuje interesujący problem. Jeśli pakiet NuGet innej firmy zostanie skompilowany dla wersji 4.0, ale z użyciem 4.5 odniesień, będziemy w tej samej sytuacji, ale nie będziemy mogli go naprawić. Lekcja dla wydawców pakietów polega na zapewnieniu kompilacji wersji 4.0 na podstawie zestawów referencyjnych.

Powiązane problemy