2014-10-11 2 views
4

При попытке объединить несколько сборок в VS сообщениях сборки я побежал в вопрос:Проблемы при использовании ILMerge сливаться .NET 3.5 и .NET 2.0 сборки

ILMerge version 2.13.307.0 
Copyright (C) Microsoft Corporation 2004-2006. All rights reserved. 
ILMerge /out:Assembly.dll AssemblyA.dll AssemblyB.dll /targetplatform:v2,C:\Windows\Microsoft.NET\Framework\v3.5 /log:log.txt 
Set platform to 'v2', using directory 'C:\Windows\Microsoft.NET\Framework\v3.5' for mscorlib.dll 
An exception occurred during merging: 
Unable to cast object of type 'System.Compiler.Class' to type 'System.Compiler.Struct'. 
    at System.Compiler.SystemTypes.Initialize(Boolean doNotLockFile, Boolean getDebugInfo, PostAssemblyLoadProcessor postAssemblyLoad) 
    at ILMerging.ILMerge.Merge() 
    at ILMerging.ILMerge.Main(String[] args) 

где AssemblyA является текущим выходным проектом $ (TargetFileName) и AssemblyB является ссылочной сборкой.

  1. AssemblyA => v3.5
  2. AssemblyB => v2.0

Странная вещь, что когда я изменить команду, чтобы использовать .NET 4 это работает:

ILMerge /out:Assembly.dll AssemblyA.dll AssemblyB.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /log:log.txt 

Поскольку я хочу, чтобы объединенная сборка была версией 3.5, а не 4, как мне заставить прежнюю команду работать или как мне разрешить эту ошибку?

+1

Используйте соответствующий каталог для mscorlib, c: \ windows \ microsoft.net \ framework \ v2.0.50727. .NET 3.5 не является новой версией. Помните, что ваша командная строка v4 [опасно неверна] (http://stackoverflow.com/a/13750130/17034). –

+0

Спасибо за комментарий @HansPassant. Я изменил бы первую команду с v3.5 на 2 ... Не могли бы вы сказать мне, как командная строка v4 опасно ошибается? – avantprime

+0

@HansPassant Если вы хотите, чтобы вас зачисляли за предоставление правильного решения, отправьте ответ в ответ. – avantprime

ответ

7

используя каталог 'C: \ Windows \ Microsoft.NET \ Framework \ v3.5' для mscorlib.dll

Посмотрите, что каталог не содержит mscorlib.dll. Их совсем немного, версии .NET Framework 3.0, 3.5 и 3.5SP1 не включают новую версию. CLR, дрожание и многие базовые сборки все еще v2.0. Единственная разница в этих поздних выпусках - это добавление сборок.

Так необходимая опция /targetplatform:v2,C:\Windows\Microsoft.NET\Framework\v2.0.50727

FWIW, не очень, очень осторожны, когда вы предназначаться .NET 4.x, в C: \ Windows \ microsoft.net каталог больше не домашний каталог контрольные сборки. Теперь находится в каталоге c: \ program files (x86) \ reference. Неправильное использование может привести к чрезвычайно сложной диагностике runtime errors, когда на компьютере установлена ​​.NET 4.5+. И теперь это делает вопрос, какой конкретный подкаталог вы выбираете.