2014-02-21 9 views
2

Visual Studio 2008에서 Visual Studio 2010으로 업그레이드 한 다양한 참조가있는 응용 프로그램이 있습니다. 해당 응용 프로그램에서 여러 참조가 '인스턴스가 이미 정의 된'수백 개의 오류를 생성하지 못하도록 일부 인스턴스에서 FALSE로 설정된 로컬 복사가 있습니다. 메시지.Visual Studio 2012에서 '로컬 복사'환경 설정을 기억하지 않는 이유는 무엇입니까?

Visual Studio 2008에서는 모두 정상적으로 작동했지만 2012로 업그레이드 한 후에는 더 이상 해당 속성을 변경할 수없는 것으로 보입니다. 예를 들어 '로컬 복사'를 사용하지 않으려는 어셈블리가 있지만 False로 변경하고 적용을 클릭하면 True로 되돌립니다.

무엇이 누락 되었습니까? 해당 옵션이나 다른 문제를 대체하는 VS 2012의 새로운 설정이 있습니까?

편집은 -에 관계없이 '로컬 복사'의 사용, 몇 가지 이상한 행동이 될 것 같지 않습니다. 문제를 복제하려면 새 콘솔 프로젝트를 시작하고 클래스 라이브러리를 추가 한 다음 콘솔 프로젝트에서 참조하십시오. 콘솔 프로젝트 설정이를 보여

enter image description here

...하지만 프로젝트 파일은 아무것도 즉 말한다 :

enter image description here

아무것도 설정되어 있지 않은 동작, 그러나, 복사를 않는다는 것입니다을 로컬 :

enter image description here

에 copylocal의 스위칭 후

enter image description here

을 ...하지만 GUI는 항상 false를 말한다 다음 truefalse에서 프로젝트와 프로젝트 파일을 저장 이제 포함!

enter image description here

답변

2

다양한 참조 로컬 복사, 당신은 잘못된 설정에 대해 얘기 거짓

이 가능성이 정확하지 않을 수로 설정해야합니다. 로컬 복사는 컴파일하는 동안 아무런 역할을하지 않습니다. 단순히 어셈블리를 빌드 디렉토리에 복사하여 프로그램을 디버깅 할 수 있도록합니다. GAC 또는 프로젝트 참조에 저장된 어셈블리의 경우에만 False 여야합니다. 다른 어셈블리에 대해 True로 설정되어 있거나 프로그램을 실행할 수 없습니다.

설정이 있어야합니다. VS2008에서 "빌드에서 사용"및 "빌드에서 종속성 사용"은 문제와 관련이 있습니다. 이것은 VS2012의 경우 VS2010의 빌드 오버홀의 일부입니다.

C++의 One Definition Rule을 위반할 때 "이미 정의 된"컴파일 오류가 발생합니다. 두 개의 정의를 가져 오는 방법을 제공하기 때문에 C++/CLI에서 매우 쉽게 수행 할 수 있습니다. 선호되는 방법은 어셈블리 참조를 통해 컴파일러가 메타 데이터에서 모든 공용 참조 클래스를 가져옵니다. .h 파일을 통해 전통적인 방식으로 가져올 때 ODR이 위반됩니다. 매우은 어셈블리 참조를 강력히 선호해야합니다. 클래스 선언은 정의와 동기화되지 않습니다. 그리고 최종 프로그램에서 중복 된 코드를 얻지는 않습니다. 또한 문제 해결이 어려운 InvalidCastExceptions 소스도 있습니다. 한 어셈블리의 클래스는 동일한 네임 스페이스와 클래스 이름을 가지고 있더라도 다른 어셈블리의 클래스와 동일하지 않습니다. 강력한 DLL 지옥 대책. NET에서.

VS2008 설정은 더 이상 사용할 수 없으며 "참조 어셈블리 출력"만 있습니다. 일반적으로 컴파일러가 메타 데이터에 정의를 가져 오도록 기본 설정은 True로 설정합니다.

+1

감사합니다. 어느 때보 다 올바르지 만 GUI가 설정을 기억하지 못하는 이유는 설명하지 않습니다. 우리가 '로컬 복사'옵션에서 보았던 버그 (당신이 말했듯이 정말로 틀린 하나였습니다)가 문제의 원인이 아닌 것 같습니다. 우리가 본 바로는 프로젝트 파일에서 'CopyLocal'이 'Private'XML 태그로 대체 된 것으로 보입니다. 'CopyLocal'설정을 변경하면 XML 파일이 변경되지만 Visual Studio GUI의 프로젝트 설정에는 영향을 미치지 않습니다. –