2015-04-22 5 views
1

У меня есть 3 проекта:Ошибка 2 Тип <T> существует в обоих ... с ILMerge

  • A_MainProject (проект запуска)
  • B_IntermediateProject
  • C_SharedClassLibrary

В depencies являются:

А зависит от B & C

B зависит от C

и C зависит только от системы.

Каждый проект имеет собственное пространство имен.

Пока не установлено ILMerge, все работает отлично.

Если ILMerge активируется для проекта A («A_MainProject») все еще работает отлично и один автономный исполняемый файл для проекта А генерируется.

Если ILMerge теперь также активируется для B_IntermediateProject, я получаю следующее сообщение об ошибке:

Error 2 The type 'C_SharedClassLibrary.SharedClass' exists in both 'c:\dev\ILMergeError\B_IntermediateProject\bin\Debug\B_IntermediateProject.exe' and 'c:\dev\ILMergeError\C_SharedClassLibrary\bin\Debug\C_SharedClassLibrary.dll' C:\dev\ILMergeError\A_MainProject\Program.cs 12 A_MainProject 

я использую "MSBuild ILMerge задач" 1.0.3-RC2 с "ILMerge" 2.13.0307 (от mbarnett) ,

Минимальный раствор содержит 3 проекта с одним классом каждого. Эта версия ILMerge активирована только один проект и работает:

ILMergeError_stillworking.zip

Эта версия также активируется по проекту B и выдает ошибку:

ILMergeError_error.zip

Если я объединить два exes и dll с ILMerge извне (ILMergeGUI) все работает нормально.

Заранее спасибо за ответы, Xan-Kun

+0

звучит как пространство имен выпуск на первый взгляд .. – MethodMan

+0

привет и спасибо за ответ. Это заставило меня задуматься уже 2 дня. Plese позвольте мне объяснить, я исхожу из фона Java, и концепция пакетов там, похоже, немного отличается от пространства имен. Не могли бы вы объяснить немного больше, что вы точно имеете в виду? Все классы должны находиться в одном пространстве имен? –

+0

Нет, они не должны находиться в одном пространстве имен и, возможно, не должны. – doogle

ответ

2

Короткий ответ в том, что вы должны позволить только ILMerge на А, где он будет сливаться как A + B + C вместе.

Причина, почему вы попали эта ошибка в том, что при включении ILMerge на B, B будет перепакованная со всеми типами C, а также (B»= B + C). Поэтому, когда ILMerge триггеры A, он будет сливаться A + B '+ C = A + (B + C) + C

Теперь 2 сценария может произойти:

  1. B использует C внутренне, и Безразлично 't (публично) выставлять любой тип C (например, как аргумент метода или возвращаемое значение). В этом случае вы можете заставить его работать через опции ILMerge (/ интернализировать на B и/allowDup на A), хотя в объединенной сборке вы получите два раза каждый тип C.

  2. B предоставляет типы C , которые, возможно, используются А. В этом случае, даже если вам удастся выполнить операцию слияния, он будет терпеть неудачу во время выполнения, потому что A и B 'ссылаются на разные типы (например, для ссылок класса C, B B'.c и A Cc), и вы получите отвратительные исключения для типов, потому что это два разных типа (одно имя, одно и то же пространство имен, но разные сборки).

(Они противно, потому что они не указывают на несоответствие сборки, и исключение только говорит, что «с не может быть приведен к типу с», что может ввести в заблуждение многих)

+0

Привет! Я принял ваш ответ, поскольку он кажется самым правильным. Хотя я никогда не сталкивался с проблемой, ваше первое предложение, безусловно, верно, и если возникает потребность в втором (или более) exe-файлах, весь процесс buld должен быть хорошо спроектирован так, чтобы точно такие ситуации не выполнялись возникают. –

 Смежные вопросы

  • Нет связанных вопросов^_^