전제 조건으로 표시하려면 'Assembly'* .dll '에 강력한 서명이 필요한 이유는 무엇입니까?


266

C # 4.0을 사용하여 Excel 추가 기능을 컴파일하려고하는데 Visual Studio에서 프로젝트를 빌드 할 때이 문제가 발생하기 시작했습니다. 이전에이 문제가 발생하지 않았다는 것을 알려주는 것이 중요합니다. 이것이 일어날 수있는 원인은 무엇입니까?


72
빠른 시도로 프로젝트의 폴더 binobj폴더를 모두 지우고 프로젝트를 다시 빌드하십시오. 때때로 이것은 작동합니다.
Jason Evans

당신은 어셈블리에 서명하고 있습니까?
펠리스 Pollano

3
@Jason, 프로젝트 청소 및 재건이 나를 위해 일했습니다. 방금 최근에 어셈블리에 서명했으며 프로젝트가 빌드되었지만 게시하지 않았습니다.
Kratz

1
@Kratz-이 팁이 당신을 위해 일하게 된 것을 기쁘게 생각합니다 :) 컴퓨터를 재부팅하여 고정시키는 것과 약간 같습니다!
Jason Evans

구성 관리자가 여러 프로젝트에서 빌드 설정을 재설정하면 (예 : "모두 다시 빌드"에서 빌드하도록 설정되지 않은 경우) 해당 프로젝트의 버전을 정하고 오류를 다시 빌드 한 후에이 문제가 발생했습니다.
alan

답변:


239

내 생각 엔 강력한 이름의 어셈블리로 작업하지 않는 것입니다. 두 프로젝트가 동일한 어셈블리의 약간 다른 버전을 참조하고 더 종속적 인 프로젝트가 이러한 프로젝트를 참조 할 때이 오류가 발생했습니다. 필자의 경우 해결 방법은 .csproj 파일의 어셈블리 이름에서 키 및 버전 정보를 제거하고 (어쨌든 중요하지 않음) 깨끗한 빌드를 수행하는 것이 었습니다.

서로 다른 어셈블리 버전 간의 변경 사항은이를 참조하는 솔루션의 일부와 호환되었습니다. 그렇지 않은 경우 문제를 해결하기 위해 추가 작업을 수행해야 할 수도 있습니다.

NuGet

NuGet을 사용하면 다음과 같은 경우이 상황에 쉽게 도달 할 수 있습니다.

  1. 솔루션에서 하나의 프로젝트에 패키지를 설치합니다.
  2. 해당 패키지의 새 버전이 패키지 소스에 배포됩니다.
  3. 동일한 솔루션으로 다른 프로젝트에 설치합니다.

결과적으로 해당 패키지 어셈블리의 다른 버전을 참조하는 솔루션의 두 프로젝트가 생성됩니다. 그중 하나가 다른 하나를 참조하고 ClickOnce 앱인 경우이 문제가 나타납니다.

이 문제를 해결하려면 update-package [package name]Nuget Package Manager 콘솔에서 명령을 실행하여 모든 것을 레벨 경기장으로 가져 가면 문제가 해결됩니다.

강력한 이유가없는 한 프로젝트 레벨이 아닌 솔루션 레벨에서 NuGet 패키지를 관리해야합니다. 솔루션 레벨 패키지 관리는 여러 버전의 종속성의 가능성을 피합니다. 관리 UI를 사용할 때 통합 탭에 하나 이상의 패키지에 여러 버전이있는 것으로 표시되면이를 하나로 통합하는 것을 고려하십시오.


7
여기에 더 많은 정보가 있습니다 : social.msdn.microsoft.com/Forums/en/csharplanguage/thread/… . 또한 binobj를 지우고 (컨트롤에있는 경우) 어셈블리 버전을 동일한 값으로 설정하면 (예 : 빌드 번호를 0으로 유지) 도움이됩니다.
Kit

3
오늘 NuGet에 대한 내 자신의 경험 과이 같은 오류를 반영하기 위해 귀하의 답변 끝에 약간의 시간을가했습니다. 누군가에게 도움이되기를 바랍니다 (아마도 몇 달 안에 나 자신도 가능합니다).
Neil Barnwell

2
이 오류가 계속 발생하여 .csproj 파일에서 어셈블리 이름을 제거한 다음 청소하면 지속적으로 수정되었습니다. 감사!
ScubaSteve

1
위의 답변이 효과가없고 Intellisense / ReSharper를 사용하여 프로젝트 중 하나에 NuGet 참조를 추가했다고 생각되면 이 답변 을보고 싶을 수 있습니다 .
David Murdoch

이 솔루션에는 4 개의 프로젝트가 포함되어 있습니다. 하나의 프로젝트 B 는 클래스 라이브러리입니다. B의 dll은 나머지 3에서 참조되었습니다. 다른 두 프로젝트 ( CD ) 실행 파일은 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 를 참조하십시오.
David Murdoch

8
MSVS 2015가 있는데 프로젝트 속성 아래에 보안 탭이 표시되지 않습니다
zeta

70

답변을 참조하십시오 .

게시 페이지로 이동하여 "응용 프로그램 파일"을 클릭하십시오. 거기에서 DLL 목록이 나타납니다. 문제가있는 사용자의 게시 상태가 "전제 조건"이 아니라 "포함"으로 표시되어 있는지 확인하십시오.


2
exel addin 프로젝트에는 응용 프로그램 파일 버튼이 없습니다. stackoverflow.com/questions/6378801/…
Sergey Kucher

@ SergeyKucher : 몰랐어요. 업데이트 해 주셔서 감사합니다. 귀하의 질문이 Excel addin에 대한 것이 아니기 때문에 내 대답은 여전히 ​​유효하다고 생각합니다 ( winforms 프로젝트 에서 동일한 오류 메시지가 있었고이 방법으로 해결했습니다).
Otiel

OP 마법사의 오류가 발생한 후에 게시 마법사를 사용할 때까지 제대로 빌드 된 winforms 프로젝트가 있습니다. 게시 상태를 변경하면 문제가 해결되었습니다. 감사합니다
Kristian

7
필자의 경우이 문제는 게시 상태를 INCLUDE (자동)에서 INCLUDE로 변경하여 해결되었습니다. 어쨌든, 당신의 대답은 표시된 값을 찌르지 않는 데 도움이되었습니다. 감사합니다
Julio Nobre

22

나는이 문제를 겪었다. 동일한 어셈블리를 가리 키지 만 다른 버전의 프로젝트가 많았 기 때문에 발생했습니다. 내 솔루션의 모든 프로젝트에 동일한 버전을 선택하여 해결합니다.


13

어셈블리 버전을 변경했거나 오류에 명시된 다른 버전의 관리되는 라이브러리를 복사 한 경우 이전에 잘못된 버전을 참조하는 파일을 컴파일했을 수도 있습니다. '모두 다시 작성'(또는 이전 주석에서 언급 한 'bin 및'obj '폴더 삭제)이이 문제를 해결해야합니다.


1
아니면 그냥 '청결한 솔루션'
Unsliced

'Rebuild All'은 먼저 정리를 수행하며 'clean'과 'build'에 해당합니다. 그러나 파일을 다른 타임 스탬프로 수동으로 복사하거나 복사 한 경우 'clean'/ 'rebuild'기능으로 문제를 해결할 수 없으며 'bin'및 'obj'폴더를 수동으로 삭제해야합니다.
Sogger

Excel과 관련된이 문제의 경우 bin / obj 폴더를 삭제하면 효과가 있었지만 다른 방법으로는 효과가 없었습니다.
William Melani 2012

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

이 질문에 다른 모든 답변을 시도한 경우 다음을 수행하십시오.

  • 솔루션에 여러 프로젝트가 있습니다
  • NuGet 패키지를 참조하는 다른 프로젝트 (프로젝트 B)를 참조하는 프로젝트 (프로젝트 A)가 있습니다.
  • 프로젝트 A에서 Intellisense / ReSharper를 사용하여 프로젝트 B에서 참조 된 NuGet 패키지에 대한 참조를 가져 왔습니다 (이는 프로젝트 B의 메소드가 NuGet 패키지에서 제공 한 유형을 리턴하고 해당 메소드가 프로젝트 A에서 사용될 때 발생할 수 있음)
  • NuGet 패키지 관리자 (또는 CLI)를 통해 NuGet 패키지를 업데이트했습니다.

... Intellisense / ReSharper에 의해 생성 된 참조는 예상대로 NuGet 참조가 아니라 "정상"참조이므로 NuGet 업데이트 프로세스는 "프로젝트 참조에 별도의 버전의 NuGet 패키지 DLL이있을 수 있습니다. ' 찾거나 업데이트하지 마십시오!

이 문제를 해결하려면 프로젝트 A에서 참조를 제거한 다음 NuGet을 사용하여 설치하고 모든 프로젝트의 NuGet 패키지가 동일한 버전인지 확인하십시오. ( 이 답변 에서 설명하는 것처럼 )


라이프 프로 팁 :

이 문제는 ReSharper / Intellisense가 프로젝트에 대한 참조를 추가 할 것을 제안 할 때마다 발생할 수 있습니다. 위의 예보다 훨씬 복잡하고 여러 개의 직조 프로젝트와 종속성으로 추적하기가 어렵습니다. ReSharper / Intellisense에서 제안한 참조가 실제로 NuGet 패키지에서 제공된 경우 NuGet을 사용하여 설치하십시오.


예, Resharper를 사용하여 참조를 추가하지 마십시오. Resharper는 디버그 (또는 릴리스 모드에있는 경우 릴리스) 폴더에서 참조 dll을 가져옵니다. 그것은 특히 거대한 프로젝트에서 많은 문제를 일으킬 것입니다.
cepriego

5

WindowsAPICodePack을 업데이트 한 후이 문제가 발생하면 솔루션을 다시 작성했습니다.

빌드-> 솔루션 재구성


4

내 솔루션에 너무 많은 프로젝트가 진행되어 개별적으로 업데이트 할 수 없으므로이 문제를 해결했습니다.

  • 솔루션을 마우스 오른쪽 단추로 클릭하고 '솔루션 용 NuGet 패키지 관리 ...'를 선택하십시오.
  • 업데이트 탭으로 이동
  • 영향을받는 패키지 찾기 및 업데이트 선택
  • 확인을 클릭하면 패키지의 모든 인스턴스가 최신 상태가됩니다.

4

문제가있는 프로젝트를 언로드했다가 다시로드하면 문제가 해결되었습니다.


4

응용 프로그램 파일 을 게시하려고 했는데 오류가 발생하는 dll 이 'Include (Auto)'에서 'Include '로 변경되었습니다 . 이제 게시 할 수 있습니다.


4

Excel Addin을 packages.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. 편집 된 .targets파일 을 참조하도록 2.에서 찾은 섹션을 변경하십시오 .

.targetsVS와 함께 제공된 파일 의 버전 이 업데이트 될 때마다 (또는 업데이트를 얻지 못할 때마다) 반복해야 하지만 곧 수정 될 것으로 기대합니다 ...


2
이 문제를 추가하기 위해 문제를 해결하는 약간 더 부드러운 방법은 지점 3에있는 파일에서 전체 <Target Name = "VisualStudioForApplicationsBuild"> 섹션을 복사하는 것입니다 (예 : 파일을 찾아서 복사하고 이름을 바꾸지 마십시오) , ** 프로젝트 파일에. ** proj 파일을 추가하고 포인트 4에 설명 된 것과 동일하게 변경합니다. 그러면 프로젝트의 동작이 무시되고 시스템의 다른 항목에는 영향을 미치지 않습니다. 향후 VS 업데이트에서 원본 파일이 변경되면 프로세스를 반복해야 할 수도 있습니다.
Adam

3

어셈블리가 올바르게 서명 되었습니까?

이를 확인하려면 프로젝트에서 Alt + Enter를 누르십시오 (또는 마우스 오른쪽 단추를 클릭 한 후 특성). "서명"으로 이동하십시오. "조립품 서명"확인란이 선택되어 있고 강력한 이름 키 파일이 선택되어 있고 "지연 부호 만"이 선택되어 있지 않은지 확인하십시오 .


* .dll에 서명하지 않았지만 이전에는 아무런 문제가 없었습니다 (이전에 컴파일 오류가 없었습니다). 게시 된 프로젝트의 참조 된 프로젝트 중 하나에서 참조 된 dll은 게시 된 프로젝트에서 직접 dll을 참조하는 못생긴 솔루션을 찾았습니다. 지금 작동하는 이유를 알려주시겠습니까? 또는 어떻게 문제를 반대 방향으로 해결할 수 있습니까? 감사합니다
Sergey Kucher

1
@ user520535 : 글쎄, 이전에 라이브러리에 서명하지 않았다면해야합니다. 이 라이브러리를 서명 된 어셈블리에서 사용할 수있는 유일한 방법은 아니지만 (서명 된 어셈블리는 서명되지 않은 어셈블리를 호출 할 수 없음) 플러그인 / 추가를 처리 할 때 서명되지 않은 어셈블리로 작업하는 것도 매우 까다 롭습니다. -에. 이제 왜 지금이 아닌 지금 문제를 일으키기 시작 했습니까? 몰라요
Arseni Mourzenko

@ user520535 : 도움이된다면 자유롭게 답변을 수락하거나 투표 할 수 있습니다.
Arseni Mourzenko

3

이제이 문제에 대한 다른 접근 방식이 있습니다.

  • 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 '프로젝트 언로드'옵션을 선택하십시오. 프로젝트를 사용할 수 없게됩니다.

  • 사용할 수없는 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 '편집'옵션을 선택하십시오.

  • 모든 자원 태그가 포함 된 '<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 파일을 참조하면 (예 : 클래스 이름 바꾸기)이 문제가 발생할 수 있습니다.

Object Browser 창 (메뉴 View-> Object Browser)에서보기를 통해 기본 프로젝트에 대한 모든 참조를 확인할 수 있습니다. dll 파일에 대한 참조는 항상 버전 번호를 갖습니다. 예 : TestLib [1.0.0.0]

솔루션 : 기본 프로젝트의 현재 참조를 라이브러리 프로젝트에 삭제하고 해당 라이브러리 프로젝트에 대한 참조를 다시 추가하십시오.


1

여기에서 대부분의 솔루션을 시도한 후에 마침내 click once 프로젝트에서 프로젝트에 대한 참조를 추가했습니다. 이것은 Include에서 Include (Auto)로 변경되어 마침내 작동했습니다.


1

도움이 된 것은 Package Manager Solution으로 이동하여 설치된 패키지를 확인하여 문제를 일으켰습니다. 여러 프로젝트가 동일한 패키지이지만 다른 버전을 참조하는 것을 보았습니다. 나는 내 필요에 따라 그것들을 정렬했고 효과가있었습니다.


0

나는 이것을 6 개의 프로젝트로 해결했습니다. 내 프로젝트 중 하나가 명명 된 어셈블리를 파일 참조로 언급하고있었습니다. 다른 사람들은 모두 프로젝트 참조를 가리키고있었습니다.

이 경우 일반적으로 다른 오류가 발생합니다.

내 솔루션은 참조 된 곳에서 명명 된 어셈블리를 삭제하고 다시 추가하는 것이 었습니다. 프로젝트를 수행 한 후에는 문제가 사라졌습니다. 이 작업을 수행하기 전에 솔루션을 청소하고 서명 한 프로젝트가 없는지 확인했습니다.

그것이 누군가를 돕기를 바랍니다 ...


0

종속성 종속성이 일치하지 않으면 솔루션 레벨에서 NuGet 패키지 관리자로 이동하여 업데이트 및 통합 탭을 확인하고 모두 조화 시키십시오.


0

나는 최근 에이 문제에 부딪쳤다. 필자의 경우 다른 어셈블리에 NuGet 패키지가 있습니다. 내가 가진 것은 내 어셈블리와 관련된 동일한 NuGet 패키지의 다른 버전이었습니다.
내 솔루션은 개별 프로젝트와 달리 솔루션에 NuGet 패키지 관리자를 사용하는 것이 었습니다. 이렇게하면 "통합"옵션이 활성화되어 원하는 수의 프로젝트에서 NuGet 패키지를 업그레이드 할 수 있으므로 모두 동일한 버전의 어셈블리를 참조합니다. 통합을 수행하면 빌드 실패가 사라졌습니다.


0

나는 또한 일종의 문제에 부딪쳤다. 내가 방금 할 일은 오류를 일으킨 .dll (참조에서 찾을 수 있음 )을 삭제하고 다시 추가하는 것 입니다.

매력처럼 작동합니다.



0

게시-> 응용 프로그램 파일->으로 이동하여 영향을받는 dll 게시 상태를 필수 조건에서 포함으로 변경하십시오! 이것은 나를 위해 일했다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.