C # 4.0을 사용하여 Excel 추가 기능을 컴파일하려고하는데 Visual Studio에서 프로젝트를 빌드 할 때이 문제가 발생하기 시작했습니다. 이전에이 문제가 발생하지 않았다는 것을 알려주는 것이 중요합니다. 이것이 일어날 수있는 원인은 무엇입니까?
C # 4.0을 사용하여 Excel 추가 기능을 컴파일하려고하는데 Visual Studio에서 프로젝트를 빌드 할 때이 문제가 발생하기 시작했습니다. 이전에이 문제가 발생하지 않았다는 것을 알려주는 것이 중요합니다. 이것이 일어날 수있는 원인은 무엇입니까?
답변:
내 생각 엔 강력한 이름의 어셈블리로 작업하지 않는 것입니다. 두 프로젝트가 동일한 어셈블리의 약간 다른 버전을 참조하고 더 종속적 인 프로젝트가 이러한 프로젝트를 참조 할 때이 오류가 발생했습니다. 필자의 경우 해결 방법은 .csproj 파일의 어셈블리 이름에서 키 및 버전 정보를 제거하고 (어쨌든 중요하지 않음) 깨끗한 빌드를 수행하는 것이 었습니다.
서로 다른 어셈블리 버전 간의 변경 사항은이를 참조하는 솔루션의 일부와 호환되었습니다. 그렇지 않은 경우 문제를 해결하기 위해 추가 작업을 수행해야 할 수도 있습니다.
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을 삭제하고 (오류가 발생한 곳) 솔루션을 다시 빌드하면 문제가 해결되었습니다. 감사
이 질문에 다른 모든 답변을 시도한 경우 다음을 수행하십시오.
... Intellisense / ReSharper에 의해 생성 된 참조는 예상대로 NuGet 참조가 아니라 "정상"참조이므로 NuGet 업데이트 프로세스는 "프로젝트 참조에 별도의 버전의 NuGet 패키지 DLL이있을 수 있습니다. ' 찾거나 업데이트하지 마십시오!
이 문제를 해결하려면 프로젝트 A에서 참조를 제거한 다음 NuGet을 사용하여 설치하고 모든 프로젝트의 NuGet 패키지가 동일한 버전인지 확인하십시오. ( 이 답변 에서 설명하는 것처럼 )
이 문제는 ReSharper / Intellisense가 프로젝트에 대한 참조를 추가 할 것을 제안 할 때마다 발생할 수 있습니다. 위의 예보다 훨씬 복잡하고 여러 개의 직조 프로젝트와 종속성으로 추적하기가 어렵습니다. ReSharper / Intellisense에서 제안한 참조가 실제로 NuGet 패키지에서 제공된 경우 NuGet을 사용하여 설치하십시오.
Excel Addin을 packages.config에서 PackageReference로 마이그레이션 한 후이 문제가 발생했습니다. 이 문제 와 관련 이 있는 것 같습니다 .
다음은 ClickOnce를 사용하지 않는 경우 기본적인 해결 방법으로 작동합니다 ( .manifest
파일 에서 모든 종속성 정보를 생략 함 ).
다음과 같은 섹션을 찾으십시오.
<!-- 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 파일을 참조하면 (예 : 클래스 이름 바꾸기)이 문제가 발생할 수 있습니다.
Object Browser 창 (메뉴 View-> Object Browser)에서보기를 통해 기본 프로젝트에 대한 모든 참조를 확인할 수 있습니다. dll 파일에 대한 참조는 항상 버전 번호를 갖습니다. 예 : TestLib [1.0.0.0]
솔루션 : 기본 프로젝트의 현재 참조를 라이브러리 프로젝트에 삭제하고 해당 라이브러리 프로젝트에 대한 참조를 다시 추가하십시오.
여기에서 대부분의 솔루션을 시도한 후에 마침내 click once 프로젝트에서 프로젝트에 대한 참조를 추가했습니다. 이것은 Include에서 Include (Auto)로 변경되어 마침내 작동했습니다.
bin
와obj
폴더를 모두 지우고 프로젝트를 다시 빌드하십시오. 때때로 이것은 작동합니다.