Чому я отримую "Асамблея" * .dll ", яка повинна бути підписана для того, щоб бути позначеною як обов'язкова умова."


266

Я намагаюся скласти свій excel addin за допомогою C # 4.0 і почав отримувати цю проблему під час створення мого проекту в Visual Studio. Важливо сказати вам, що раніше у мене не було цієї проблеми. Що може спричинити це?


72
Швидко спробуйте очистити як binі objпапки вашого проекту, так і створити проект заново. Іноді це працює.
Джейсон Еванс

ти підписуєш асамблею?
Феліче Поллано

3
@Jason, прибирання проекту та реконструкція працювали на мене. Я нещодавно підписав збори, і проект будуватиметься, але не публікував.
Kratz

1
@Kratz - Радий, що ця порада спрацювала для вас :) Це трохи схоже на виправлення комп'ютера, перезавантаживши його!
Джейсон Еванс

Це трапилося зі мною, коли менеджер конфігурації скинув налаштування збірки для декількох моїх проектів (тобто вони не були налаштовані на створення "Перебудувати всі"), після того як версії цих проектів та відновлення відбудуться, відбудеться помилка.
алан

Відповіді:


239

Я здогадуюсь, що ви не працюєте з сильно названими складами. У мене виникла помилка, коли два проекти посилаються на трохи різні версії однієї збірки і більш залежні проекти посилаються на ці проекти. У моєму випадку було вирішено видалити інформацію про ключ та версію з назви збірки у файлах .csproj (все одно це не мало значення), а потім виконати чисту збірку.

Зміни між різними версіями складання були сумісні з частинами рішення, що посилаються на них. Якщо з вами це не так, можливо, вам доведеться провести ще одну роботу, щоб вирішити проблему.

NuGet

З NuGet легко потрапити в цю ситуацію, якщо:

  1. Ви встановлюєте пакет до одного проекту у своєму рішенні.
  2. Нова версія цього пакета розгорнута до джерела пакета.
  3. Ви встановлюєте його в інший проект у тому самому рішенні.

Це призводить до двох проектів у вашому рішенні, де посилаються на різні версії складання цього пакету. Якщо одна з них посилається на іншу і є програмою ClickOnce, ви побачите цю проблему.

Щоб виправити це, update-package [package name]видайте команду на консолі диспетчера пакунків Nuget, щоб привести все до рівних ігрових умов, і в цей момент проблема усунеться.

Вам слід керувати пакетами NuGet на рівні рішення, а не на рівні проекту, якщо немає вагомих причин цього не робити. Управління пакетом рішень дозволяє уникнути потенціалу декількох версій залежностей. Якщо ви користуєтесь інтерфейсом управління, якщо на вкладці " Консолідований" показано, що 1 або більше пакетів мають кілька версій, розгляньте можливість їх об'єднання в одну.


7
Ось ще інформація: social.msdn.microsoft.com/Forums/en/csharplanguage/thread/… . Також допомагає очищення bin та obj та (якщо у вас є контроль) встановлення версії збірки на однакове значення (наприклад, залишення номера збірки нульовим).
Кіт

3
Я трохи причепився до кінця вашої відповіді, щоб відобразити мій власний досвід сьогодні з NuGet і цю саму помилку. Сподіваюсь, це допоможе комусь колись (можливо, навіть самому через кілька місяців!).
Ніл Барнвелл

2
Ця помилка постійно вискакує для мене і видаляє назву збірки з файлу .csproj, після чого очищення послідовно виправляє її. Дякую!
ScubaSteve

1
Ви можете побачити цю відповідь, якщо вищевказана відповідь не спрацювала, і ви думаєте, що ви додали посилання NuGet до одного зі своїх проектів за допомогою Intellisense / ReSharper.
Девід Мердок

Рішення містить 4 проекти. Один проект B - бібліотека класів. Про посилання Б на посилання в решті трьох. Два інших проекти ( C і D ) виконувані в даний час посилаються в A . Тому я будую A і отримав дуже те саме питання. Виправлення було відновити інші два проекти першими. А потім відновлення проекту A Нерухома проблема.
Vikram Singh Saini

268

У мене виникла ця проблема, я вирішив її, вимкнувши "Увімкнути параметри безпеки ClickOnce".

Меню: Проект | "Назва проекту" Властивості ... | Вкладка безпеки | Повідомити прапорець "Увімкнути настройки безпеки ClickOnce".


2
Не працював для мене у VS2012 (прапорець перевіряється автоматично під час публікації). Я використовував цю відповідь замість цього, оскільки DLL потрібна була лише для процесу збирання. stackoverflow.com/a/8123074/17713
Matthias Meid

3
Під час використання ClickOnce цей прапорець автоматично вибирається щоразу, коли додаток публікується за допомогою майстра публікації. Для отримання додаткової інформації див. Msdn.microsoft.com/en-us/library/1sfbfyk0.aspx .
Девід Мердок

8
У мене MSVS 2015, і я не бачу вкладку безпеки під властивостями проекту
zeta

70

Дивіться цю відповідь .

Перейдіть на сторінку публікації та натисніть "Файли додатків". Звідти вам слід побачити список ваших DLL-файлів. Переконайтесь, що ті, хто створює проблеми, мають статус публікації, позначений як "Включити", а не "Попередня умова".


2
У проекті Exel addin немає кнопки Файли прикладних програм. stackoverflow.com/questions/6378801/…
Сергій Кучер

@SergeyKucher: Я цього не знав. Дякуємо за оновлення. Оскільки ваше запитання не точно вказало, що це стосується додатка Excel, я думаю, що моя відповідь все ще справедлива тут (у мене було те саме повідомлення про помилку в проекті winforms і вирішено це таким чином).
Otiel

У мене є проект winforms, який склався чудово, поки я не скористався майстром публікації, після чого отримав помилки ОП. Зміна статусу публікації усунула проблему. Спасибі
Крістіан

7
У моєму випадку цю проблему було вирішено, змінивши статус публікації з INCLUDE (auto) на просто INCLUDE. У будь-якому випадку, ваша відповідь допомогла не натягувати на показані значення. Велике спасибі
Хуліо Нобре

22

У мене була ця проблема. Це сталося тому, що в мене було багато проектів, що вказували на одну і ту ж збірку, але з різних версій. Я вирішую його, вибравши однакову версію для всіх проектів у своєму рішенні.


13

Якщо ви змінили версію збірки або скопіювали іншу версію керованої бібліотеки, зазначену в помилці, можливо, раніше були складені файли, що посилаються на неправильну версію. "Виправити всі" (або видалити папки "bin" та "obj", як згадувалося в попередньому коментарі) має виправити цю справу.


1
Або просто «Чистий розчин»
Невикладене

"Відновити все" виконує очищення спочатку і еквівалентно "очистити", а потім "скласти". Хоча зауважити, що іноді, коли файли були вручну скопійовані або скопійовані з різними часовими позначками, функція "очистити" / "відновити" не усуває проблеми, і потрібно вручну видалити папки "bin" і "obj".
Sogger

У цьому питанні, пов’язаному з Excel, видалення папок bin / obj працювало на мене, інші підходи не зробили.
Вільям Мелані

6

вам потрібно підписати збірку ключем. Перейдіть у властивості проекту під підписанням вкладки: введіть тут опис зображення


6

Додавання мого рішення цієї проблеми для кожного, хто може допомогти.

У мене було рішення ClickOnce, яке видало цю помилку. Додаток посилалося на загальну папку "Libs" і містило посилання на проект на Foo.dll. Хоча жоден з проектів у рішенні не посилався на статичну копію Foo.dllв папці "Libs", деякі з посилань у цій папці зробили (тобто: моє рішення було посиланням на Libs\Bar.dllяке посилання Foo.dll.) Оскільки програма CO витягнула всі залежності від Libsяк і їх залежності, обидві копії збиралися в проект. Це генерувало помилку вище.

Я виправив цю проблему, перемістивши свою Libs\Foo.dllстатичну версію в підкаталог, Libs\Fix\Foo.dll. Ця зміна дозволила додатку ClickOnce використовувати лише версію проекту DLL та помилка зникла.



6

Якщо ви спробували всі інші відповіді на це запитання, і ви:

  • Майте кілька проектів у своєму рішенні
  • Майте проект (Project A), який посилається на інший проект (Project B), проект якого посилається на пакет NuGet.
  • У проекті A ви використовували Intellisense / ReSharper для введення посилання на пакет NuGet, на який посилається в Project B (це може статися, коли метод в Project B повертає тип, наданий пакетом NuGet, і цей метод використовується в Project A)
  • оновив пакет NuGet через NuGet Package Manager (або CLI).

... у вас можуть бути окремі версії пакетів DLG NuGet у посиланнях ваших проектів, оскільки посилання, створене Intellisense / ReSharper, буде "нормальною" посиланням, а не посиланням NuGet, як очікувалося, тому процес оновлення NuGet переміг " не знайти або оновити його!

Щоб виправити це, видаліть посилання в Project A, потім використовуйте NuGet для його встановлення та переконайтесь, що пакети NuGet у всіх проектах є однаковою версією. (як поясніть у цій відповіді )


Порада Life Pro:

Ця проблема може виникнути, коли ReSharper / Intellisense пропонує додати посилання на ваш проект. Це може бути набагато глибше заплутаним, ніж наведений вище приклад, завдяки численним переплетенням проектів та залежностей, що ускладнює їх пошук. Якщо посилання, запропоноване ReSharper / Intellisense, насправді є пакетом NuGet, використовуйте NuGet для його встановлення.


Так, уникайте використання Resharper для додавання посилань. Resharper візьме контрольний dll з папки налагодження (або випустить, якщо ви перебуваєте в режимі випуску). Це спричинить багато проблем, особливо у величезних проектах.
cepriego

5

Коли це сталося зі мною з WindowsAPICodePack після того, як я його оновив, я просто переробив рішення.

Збірка -> Перебудова рішення


4

У моєму рішенні було занадто багато проектів, щоб пройти і індивідуально оновити, тому я це виправив:

  • Клацніть правою кнопкою миші моє рішення та виберіть "Керувати пакетами NuGet для рішення ..."
  • Перехід на вкладку "Оновлення"
  • Знайти пакунок із пакунками та вибрати Оновити
  • Натиснувши ОК, і це оновило всі екземпляри пакета

4

Вивантаження та перезавантаження проблемного проекту вирішило це для мене.


4

Я пішов публікувати , файли додатків, виявив, що dll видає помилку, змінив її на "Включити" з "Включити (Авто)". Зараз я можу публікувати.


4

Я зіткнувся з цією проблемою після міграції Excel Addin з пакета.config до PackageReference. Здається, це стосується цього питання .

Наведене нижче працює як грубе вирішення, якщо ви не використовуєте ClickOnce (він опустить всю інформацію про залежність з .manifestфайлу):

  1. Вивантажте проект, відредагуйте .csproj
  2. Знайдіть розділ, який виглядає так:

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
  3. Відредагуйте перейменовану копію посиланого .targetsфайлу (у моєму випадку файл вирішено, C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targetsі я зробив копію Microsoft.VisualStudio.Tools.Office_FIX.targetsв одній папці - не перевірив, чи працює він з іншої папки).

  4. Знайдіть GenerateApplicationManifestелемент і змініть його атрибут Dependencies="@(DependenciesForGam)"на Dependencies="".

  5. Змініть розділ, знайдений у розділі 2., щоб посилатися на ваш відредагований .targetsфайл.

Це потрібно буде повторювати щоразу, коли версія .targetsфайлу, що постачається з VS, оновлюється (або ви не отримаєте оновлення), але я сподіваюся, що це буде виправлено незабаром ...


2
Щоб додати до цього, дещо ніжніший спосіб вирішення проблеми - скопіювати весь <Target Name = "VisualStudioForApplicationsBuild"> розділ з файлу, розташованого в точці 3 (тобто: просто знайдіть файл, не скопіюйте його та не перейменуйте його) , у файл вашого власного проекту. ** proj-файл та внесіть ті самі зміни, що описані в пункті 4. Це змінить поведінку лише для вашого проекту, а потім не вплине на що-небудь інше на вашій машині. Якщо в майбутньому оновлення VS є зміни вихідного файлу, можливо, вам доведеться повторити процес.
Адам

3

Чи правильно підписана ваша асамблея?

Щоб перевірити це, натисніть Alt + Enter у своєму проекті (або клацніть правою кнопкою миші, а потім Властивості). Перейдіть до розділу "Підписання". Переконайтесь, що прапорець "Підписати збірку" встановлено, і вибрано файл міцного ключа імені та не буде встановлено прапорець "Тільки знак затримки" .


Я не підписав * .dll, але раніше з ним не було проблем (я раніше не мав помилки компіляції). Про dll, на який посилався в одному з опублікованих проектів, я знайшов некрасиве рішення для посилання на dll безпосередньо з опублікованого проекту, чи можете ви мені скажіть, чому він працює зараз? Або як я міг би вирішити проблему іншим способом? Дякую
Сергій Кучер

1
@ user520535: добре, якщо ви раніше не підписували бібліотеку, ви повинні. Це не єдиний спосіб, коли ця бібліотека може використовувати підписані асамблеї (підписана збірка не може викликати неподписану), але робота з непідписаними збірками також дуже складна, коли ви маєте справу з плагінами / доданнями -ін. Тепер, чому це почало створювати проблеми зараз, а не раніше? Я поняття не маю.
Арсеній Мурценко

@ user520535: якщо це допомогло, ви можете прийняти або схвалити відповідь.
Арсеній Мурценко

3

Тепер ось інший підхід до проблеми:

  • Клацніть правою кнопкою миші на проект та оберіть опцію 'Unload Project'. Ви помітите, що проект стає недоступним.

  • Клацніть правою кнопкою миші на недоступному проекті та оберіть опцію "Редагувати".

  • Прокрутіть униз до тегу "<ItemGroup>", який містить усі теги ресурсів.

  • Тепер перейдіть до посилання, що відображається у списку помилок, ви помітите, що він використовує один тег (тобто < Reference Include="assemble_name_here, Version=0.0.0.0, Culture=neutral" / >).

  • Змініть це так, щоб виглядати так:

.

<Reference Include="assemble_name_here, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" >
    < Private > True < / Private >
    < HintPath > path_here\assemble_name_here.dll < / HintPath >
< / Reference >
  • Збережіть зміни, клацніть правою кнопкою миші знову недоступний проект та натисніть на опцію «Перезавантажити проект», а потім складіть.

3

Це викликано при зміні версії .dll, на яку посилається. Потрібно видалити всі елементи або .dll у папці цільової збірки.


2

Я отримав подібну помилку компілятора. Як тільки я додаю залежний проект файлу dll до рішення, проблема вирішена.


2

Якщо ваш головний проект використовує деякі бібліотечні проекти та посилаєтесь на них, ви можете викликати цю проблему, якщо ваш проект посилається на файл dll збірки, а не на проект бібліотеки, коли ви щось змінюєте в проекті бібліотеки (наприклад: перейменуйте клас).

Ви можете перевірити всі посилання на ваш головний проект, переглянувши у вікні браузера об’єктів (меню Перегляд-> Оглядач об’єктів). Посилання на файл dll завжди має номер версії. Наприклад: TestLib [1.0.0.0]

Рішення: видаліть поточне посилання вашого основного проекту на проект бібліотеки і знову додайте посилання на цей проект бібліотеки.


1

Спробувавши більшість рішень тут, я, нарешті, просто додав посилання на проект із проекту один раз, це змінило його на «Включити (Авто)» з «Включити», і воно, нарешті, спрацювало.


1

Що мені допомогло, я перейшов на Package Manager Solution і переглянув встановлений пакет, який спричинив проблему. Я бачив, що кілька проектів посилаються на один і той же пакет, але різні версії. Я вирівняв їх на основі моїх потреб, і це спрацювало.


0

Я мав це в рішенні з 6 проектів. Один із моїх проектів посилався на названу збірку як на посилання на файл. Інші всі вказували на посилання на проект.

У цих випадках я зазвичай отримую іншу помилку.

Моє рішення полягало в тому, щоб видалити названу збірку де завгодно, на яку вона посилалась, і додати її назад. Як тільки я працював над проектом, ця проблема зникла. Перш ніж це зробити, я спробував очистити розчин, а також переконався, що жоден із проектів не був підписаний.

сподіваюся, що це комусь допоможе ...


0

Якщо це невідповідність залежностей залежностей, перейдіть до менеджера пакетів NuGet на рівні рішення і перевірте вкладки «Оновити та консолідувати», гармонізуйте все це.


0

Нещодавно я потрапив на цю проблему. У моєму випадку я маю пакети NuGet на різних складах. У мене були різні версії тих же пакетів NuGet, пов'язаних з моїми власними збірками.
Моє рішення полягало у використанні менеджера пакунків NuGet після рішення, на відміну від окремих проектів. Це дає можливість "консолідації", де ви можете оновити ваші пакети NuGet на стільки проектів, скільки хочете - тому всі вони посилаються на одну і ту ж версію збірки. Коли я робив консолідацію, провал збірки зник.


0

Я також натрапляю на певну проблему, все, що мені потрібно було зробити, це видалити .dll (можна знайти посилання), що викликає помилку, і додати її знову .

Працює як шарм.



0

Просто перейдіть до Публікувати -> Файл програми -> І змініть статус опублікованого DLL з необхідної умови включення! Це працювало для мене!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.