2012-07-18 3 views
2

Proj1과 Proj2의 두 프로젝트 (Proj1은 시작 프로젝트 임)가있는 솔루션이 있습니다.두 번째 버전의 동일한 타사 DLL을 참조하는 방법이 필요합니다.

Proj1은 Proj2 (Proj2의 클래스를 호출하기 위해)를 참조하며 1.0.0.0에서 버전이 지정되는 A라는 타사 DLL을 참조하는 기존 코드를 포함합니다.

Proj2는 동일한 타사 DLL A를 참조하지만 2.0.0.0 버전에서이 프로젝트를 참조합니다.이 프로젝트의 클래스는 1.0.0.0에서 사용할 수 없었던 새로운 구현이 필요하기 때문입니다. , 1. 2. 추가를 Proj2에서 "v2Folder"라는 폴더를 참조 할 때 참으로 "특정 버전"을 전환하고 그것에 v2.0.0.0을 추가 설정 :

지금까지 나는 다음 시도했다 "Copy to Output Directory"를 항상 복사로 지정합니다. 3. app.config에 "probing path"를 추가하여 v2.0.0.0 DLL이있는 하위 폴더를 가리 키도록했습니다.

내가 원하는 것은 v1을 보는 것입니다. 0.0.0은 일반 \ bin \ 폴더에 있고 v2.0.0.0은 \ bin \ v2Folder에 있습니다. Proj1.exe를 실행하면 Proj1의 이전 코드는 여전히 v1.0.0.0의 메서드를 호출합니다. Proj2가 구현 한 것을 호출 할 때만 v2.0.0.0의 메소드를 호출합니다.

문제는 솔루션을 빌드 할 때 v1.0.0.0이 v2.0.0.0으로 바뀌고 빌드 로그에 "A, 버전 = 2.0.0.0, Culture = neutral, PublicKeyToken = blah "and"A, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = blah "를 선택하십시오."A, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = blah "를 임의로 선택하십시오.

누군가 도움을 줄 수 있습니까?

+0

귀하의 제안에 대해 아드리아누에게 감사드립니다. 내 문제는 내 응용 프로그램에서 코드의 다른 부분에서 두 버전을 모두 사용하게하려는 것입니다. 즉, 버전 1과 2를 모두 유지하려고합니다. – codetc

+0

새 버전의 DLL "A"를 사용하도록 Proj1을 업그레이드하지 않는 이유는 무엇입니까? 동일한 DLL의 다른 버전을 사용하는 것은 권장되지 않으며 실제로 AssemblyResolver를 사용하여 해킹하지 않아도 가능하지 않습니다. 다음은이 상황에서 NuGet이 어떻게 당신을 도울 수 있는지 설명하는 링크입니다 : http://blog.davidebbo.com/2011/01/nuget-versioning-part-1-taking-on-dll.html –

답변

0

타사 dll 버전 2.0의 이름을 A_2.dll로 바꾸고 이름을 바꾼 dll에 대한 참조를 추가하십시오.

+0

내부 네임 스페이스와 클래스 이름이 동일하게 유지되고 이름 충돌을 야기하므로 작동하지 않습니다 –

1

이것은 extern alias 기능을 사용하여 가능할 수 있습니다. 컴파일 할 때, DLL 파일에 별명, 예를 들면 다음과 같습니다 : CS 파일에서

csc.exe ... /reference:AV1=v1.0.0.0/A.dll /reference:AV2=v2.0.0.0/A.dll 

(. 이것은 참조의 aliases 속성을 변경하여뿐만 아니라 비주얼 스튜디오에서 설정할 수 있습니다)

당신

extern alias AV1; 
extern alias AV2; 
// using statements 

이 독립적으로 각 버전에 참조 할 수 있습니다 :

var v1foo = new AV1::Foo(); 
var v2foo = new AV2::Foo(); 
012 네임 스페이스를 참조하는 extern alias를 사용할 수 있습니다

DLL 중 하나만 사용하는 프로젝트의 경우 원하는 버전에 대한 참조를 포함 할 수 있습니다.

// ProjA cs file 
extern alias AV1; 
using Foo = AV1::Foo; // alternately, path to namespace 
... 
var foo = new Foo(); // from version 1 of library 


// ProjB cs file 
extern alias AV2; 
using Foo = AV2::Foo; // alternately, path to namespace 
... 
var foo = new Foo(); // from version 2 of library 

이렇게하면 두 버전의 DLL을 동일한 솔루션에서 독립적으로 참조 할 수 있습니다. (MSDN Reference)

+0

샘플 코드를 drf에 보내 주셔서 감사합니다. Proj1 만 남겨 놓은 것을 제외하고는 (지금은 별명이 여전히 "전역"입니다.) "Extern alias AV2"를 사용하는 Proj2의 코드 만 지정했습니다. 또한 app.config에 "probing privatePath ="v12; ""를 추가하여 v12 DLL을로드 할 위치를 알 수 있습니다. 런타임에 "파일 또는 어셈블리 'A, 버전 = 2.0.0.0, ....을로드 할 수 없습니다"라는 "FileLoadException"이 표시됩니다. – codetc

관련 문제