전제 조건으로 표시하려면 'Assembly'* .dll '에 강력한 서명이 필요한 이유는 무엇입니까?
C # 4.0을 사용하여 Excel 추가 기능을 컴파일하려고하는데 Visual Studio에서 프로젝트를 빌드 할 때이 문제가 발생하기 시작했습니다. 이전에이 문제가 발생하지 않았다는 것을 알려주는 것이 중요합니다. 이것이 일어날 수있는 원인은 무엇입니까?
내 생각 엔 강력한 이름의 어셈블리로 작업하지 않는 것입니다. 두 프로젝트가 동일한 어셈블리의 약간 다른 버전을 참조하고 더 종속적 인 프로젝트가 이러한 프로젝트를 참조 할 때이 오류가 발생했습니다. 필자의 경우 해결 방법은 .csproj 파일의 어셈블리 이름에서 키 및 버전 정보를 제거한 다음 (아무 중요하지 않음) 깨끗한 빌드를 수행하는 것이 었습니다.
서로 다른 어셈블리 버전 간의 변경 사항은이를 참조하는 솔루션의 일부와 호환되었습니다. 그렇지 않은 경우 문제를 해결하기 위해 추가 작업을 수행해야 할 수도 있습니다.
NuGet
NuGet을 사용하면 다음과 같은 경우이 상황에 쉽게 도달 할 수 있습니다.
- 솔루션에서 하나의 프로젝트에 패키지를 설치합니다.
- 해당 패키지의 새 버전이 패키지 소스에 배포됩니다.
- 동일한 솔루션으로 다른 프로젝트에 설치합니다.
이로 인해 솔루션의 두 프로젝트가 해당 패키지 어셈블리의 다른 버전을 참조하게됩니다. 그중 하나가 다른 하나를 참조하고 ClickOnce 앱인 경우이 문제가 나타납니다.
이 문제를 해결하려면 update-package [package name]
Nuget Package Manager 콘솔에서 명령을 실행하여 모든 것을 레벨 경기장으로 가져 가면 문제가 해결됩니다.
강력한 이유가없는 한 프로젝트 레벨이 아닌 솔루션 레벨에서 NuGet 패키지를 관리해야합니다. 솔루션 레벨 패키지 관리는 여러 버전의 종속성의 가능성을 피합니다. 관리 UI를 사용할 때 통합 탭에 하나 이상의 패키지에 여러 버전이있는 것으로 표시되면이를 하나로 통합하는 것이 좋습니다.
이 문제가 발생했을 때 'ClickOnce 보안 설정 사용'을 해제하여 문제를 해결했습니다.
메뉴 : 프로젝트 | '프로젝트 이름'속성 ... | 보안 탭 | 'ClickOnce 보안 설정 사용'확인란.
이 답변을 참조하십시오 .
게시 페이지로 이동하여 "응용 프로그램 파일"을 클릭하십시오. 거기에서 DLL 목록이 나타납니다. 문제가있는 사용자의 게시 상태가 "전제 조건"이 아니라 "포함"으로 표시되어 있는지 확인하십시오.
나는이 문제를 겪었다. 동일한 어셈블리를 가리 키지 만 다른 버전의 프로젝트가 많았 기 때문에 발생했습니다. 내 솔루션의 모든 프로젝트에 동일한 버전을 선택하여 해결합니다.
어셈블리 버전을 변경했거나 오류에 언급 된 다른 버전의 관리되는 라이브러리를 복사 한 경우 이전에 잘못된 버전을 참조하는 파일을 컴파일했을 수도 있습니다. '모두 다시 작성'(또는 이전 주석에서 언급 한 'bin 및'obj '폴더 삭제)이이 문제를 해결해야합니다.
키로 어셈블리에 서명해야합니다. 탭 서명 아래의 프로젝트 속성으로 이동하십시오.
누군가 에게이 문제에 대한 해결책을 추가하면 도움이 될 수 있습니다.
이 오류가 발생하는 ClickOnce 솔루션이 있습니다. 이 앱은 공통 "Libs"폴더를 참조하고에 대한 프로젝트 참조를 포함했습니다 Foo.dll
. 솔루션의 프로젝트 중 어느 것도 Foo.dll
"Libs"폴더에 있는 정적 사본을 참조하지 않았지만 해당 폴더에있는 일부 참조는 수행했습니다 (예 : 내 솔루션에 Libs\Bar.dll
참조 된 참조가 있음) Foo.dll
. CO 앱이 모든 종속성을 가져 왔기 때문에 Libs
의존성뿐만 아니라 두 사본 모두 프로젝트에 참여했습니다. 위의 오류가 발생했습니다.
Libs\Foo.dll
정적 버전을 하위 폴더로 이동하여 문제를 해결했습니다 Libs\Fix\Foo.dll
. 이 변경으로 ClickOnce 앱은 DLL의 프로젝트 버전 만 사용하게되었으며 오류는 사라졌습니다.
DLL을 삭제하고 (오류가 발생한 곳) 솔루션을 다시 빌드하면 문제가 해결되었습니다. 감사
이 질문에 대한 다른 모든 답변을 시도한 경우 :
- 솔루션에 여러 프로젝트가 있습니다
- 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을 사용하여 설치하십시오.
WindowsAPICodePack을 업데이트 한 후이 문제가 발생하면 솔루션을 다시 작성했습니다.
빌드-> 솔루션 재구성
내 솔루션에 너무 많은 프로젝트가 진행되어 개별적으로 업데이트 할 수 없으므로이 문제를 해결했습니다.
- 솔루션을 마우스 오른쪽 단추로 클릭하고 '솔루션 용 NuGet 패키지 관리 ...'를 선택하십시오.
- 업데이트 탭으로 이동
- 영향을받는 패키지 찾기 및 업데이트 선택
- 확인을 클릭하면 패키지의 모든 인스턴스가 최신 상태가됩니다.
문제가있는 프로젝트를 언로드했다가 다시로드하면 문제가 해결되었습니다.
응용 프로그램 파일 을 게시하려고 했는데 오류가 발생하는 dll 이 'Include (Auto)'에서 'Include '로 변경되었습니다 . 이제 게시 할 수 있습니다.
Excel Addin을 packages.config에서 PackageReference로 마이그레이션 한 후이 문제가 발생했습니다. 이 문제 와 관련 이 있는 것 같습니다 .
다음은 ClickOnce를 사용하지 않는 경우 기본적인 해결 방법으로 작동합니다 ( .manifest
파일 에서 모든 종속성 정보를 생략 함 ).
- 프로젝트 언로드, .csproj 편집
다음과 같은 섹션을 찾으십시오.
<!-- Include additional build rules for an Office application add-in. --> <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
참조 된
.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
을 만들었습니다 -다른 폴더에서 작동하는지 확인하지 않았습니다).GenerateApplicationManifest
요소를 찾아서 속성Dependencies="@(DependenciesForGam)"
을로 변경하십시오Dependencies=""
.편집 된
.targets
파일 을 참조하도록 2.에서 찾은 섹션을 변경하십시오 .
.targets
VS와 함께 제공된 파일 버전 이 업데이트 될 때마다 (또는 업데이트를 얻지 못할 때마다) 반복해야 하지만 곧 수정 될 것으로 기대합니다 ...
어셈블리가 올바르게 서명 되었습니까?
이를 확인하려면 프로젝트에서 Alt + Enter를 누르십시오 (또는 마우스 오른쪽 단추를 클릭 한 후 특성). "서명"으로 이동하십시오. "조립품 서명"확인란이 선택되어 있고 강력한 이름 키 파일이 선택되어 있고 "지연 부호 만"이 선택되어 있지 않은지 확인하십시오 .
이제이 문제에 대한 다른 접근 방식이 있습니다.
프로젝트를 마우스 오른쪽 버튼으로 클릭하고 '프로젝트 언로드'옵션을 선택하십시오. 프로젝트를 사용할 수 없게됩니다.
사용할 수없는 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 '편집'옵션을 선택하십시오.
모든 자원 태그가 포함 된 '<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 >
- 변경 사항을 저장하고 사용 불가능한 프로젝트를 다시 마우스 오른쪽 단추로 클릭 한 후 '프로젝트 다시로드'옵션을 클릭 한 후 빌드하십시오.
이 참조되는 .dll 버전을 변경할 때 발생합니다. 모든 항목 또는 대상 빌드 폴더의 .dll을 삭제해야합니다.
비슷한 컴파일러 오류가 발생했습니다. dll 파일의 종속 프로젝트를 솔루션에 추가하면 문제가 해결되었습니다.
일부 라이브러리 프로젝트를 사용하는 기본 프로젝트에서 참조하는 경우 라이브러리 프로젝트에서 무언가를 변경할 때 프로젝트가 라이브러리 프로젝트 대신 어셈블리 dll 파일을 참조하면 (예 : 클래스 이름 바꾸기)이 문제가 발생할 수 있습니다.
Object Browser 창 (메뉴 View-> Object Browser)에서보기를 통해 기본 프로젝트에 대한 모든 참조를 확인할 수 있습니다. dll 파일에 대한 참조는 항상 버전 번호를 갖습니다. 예 : TestLib [1.0.0.0]
솔루션 : 기본 프로젝트의 현재 참조를 라이브러리 프로젝트에 삭제하고 해당 라이브러리 프로젝트에 대한 참조를 다시 추가하십시오.
여기에서 대부분의 솔루션을 시도한 후 마침내 한 번의 클릭으로 프로젝트에서 프로젝트에 대한 참조를 추가했습니다. 이것은 Include에서 Include (Auto)로 변경되어 마침내 작동했습니다.
도움이 된 것은 Package Manager Solution으로 이동하여 설치된 패키지를 확인하여 문제를 일으켰습니다. 여러 프로젝트가 동일한 패키지이지만 다른 버전을 참조하는 것을 보았습니다. 나는 내 필요에 따라 그것들을 정렬했고 효과가있었습니다.
나는 이것을 6 개의 프로젝트로 해결했습니다. 내 프로젝트 중 하나가 명명 된 어셈블리를 파일 참조로 언급하고있었습니다. 다른 사람들은 모두 프로젝트 참조를 가리키고있었습니다.
이 경우 일반적으로 다른 오류가 발생합니다.
내 솔루션은 참조 된 곳에서 명명 된 어셈블리를 삭제하고 다시 추가하는 것이 었습니다. 프로젝트를 수행 한 후에는 문제가 사라졌습니다. 이 작업을 수행하기 전에 솔루션을 청소하고 서명 한 프로젝트가 없는지 확인했습니다.
그것이 누군가를 돕기를 바랍니다 ...
종속성 종속성이 일치하지 않으면 솔루션 레벨에서 NuGet 패키지 관리자로 이동하여 업데이트 및 통합 탭을 확인하고 모두 조화 시키십시오.
나는 최근 에이 문제에 부딪쳤다. 필자의 경우 다른 어셈블리에 NuGet 패키지가 있습니다. 내가 가진 것은 내 어셈블리와 관련된 동일한 NuGet 패키지의 다른 버전이었습니다.
내 솔루션은 개별 프로젝트와 달리 솔루션에 NuGet 패키지 관리자를 사용하는 것이 었습니다. 이렇게하면 "통합"옵션이 활성화되어 원하는 수의 프로젝트에서 NuGet 패키지를 업그레이드 할 수 있으므로 모두 동일한 버전의 어셈블리를 참조합니다. 통합을 수행하면 빌드 실패가 사라졌습니다.
나는 또한 일종의 문제에 부딪쳤다. 내가 방금해야 할 일은 오류를 일으킨 .dll (참조에서 찾을 수 있음 )을 삭제하고 다시 추가하는 것 입니다.
매력처럼 작동합니다.
update-package -reinstall -ignoredependencies로 시도하십시오.
'IT' 카테고리의 다른 글
C의 포인터 : 앰퍼샌드와 별표를 언제 사용해야합니까? (0) | 2020.03.30 |
---|---|
mysql에서 열이 비어 있는지 또는 null인지 확인하는 방법 (0) | 2020.03.30 |
iPhone 시뮬레이터에서 앱이 실행 중인지 프로그래밍 방식으로 확인할 수 있습니까? (0) | 2020.03.30 |
선택 상자에서 항목 제거 (0) | 2020.03.30 |
루비에서 내림차순으로 배열 정렬 (0) | 2020.03.30 |