2011-08-23 5 views
3

.NET에서 플러그인 시스템을 구현했습니다. 기본 라이브러리는 플러그인에 노출 된 기본 클래스 및 인터페이스를 구현하며, 플러그인 라이브러리는 노출 된 클래스 및 인터페이스를 사용하기 위해 기본 라이브러리를 연결합니다.C# 플러그인 시스템 이진 호환성 문제

내가 직면하고있어 문제는 (또는 수정없이) 기본 라이브러리의 (단순) 재 컴파일은 예외 메시지주고,로드 할 수 플러그인을하지 못하도록 할 것입니다 :

"Could not load file or assembly 'BaseLibrary, Version=0.0.1.68, Culture=neutral, PublicKeyToken=7b445b12e635292c' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)" 

이 문제를 는 기본 라이브러리와 플러그인 라이브러리를 모두 한꺼번에 컴파일하여 해결되지만,이 단계에서는 기본 라이브러리를 자주 수정하기 때문에 개발 중에는별로 편하지 않습니다.

이진 일치를 "완화"하는 방법이 있다면?

기본 라이브러리 어셈블리 정보 (아래 인용)가 문제의 원인 일 수 있습니까?

[assembly: AssemblyVersion("0.0.1.*")] 

어셈블리에 서명하는 것을 잊었습니다.


어셈블리 여기 나에게 다음과 같은 루틴

Assembly hLibrary = Assembly.LoadFile(pPath); 
Type plugImageCodecFactoryType = hLibrary.GetType("Derm.ImageCodecPluginFactory", true, false); 
object plugImageCodecFactory = Activator.CreateInstance(plugImageCodecFactoryType); 
object plugInstance; 

MethodInfo plugFactoryCreate = plugImageCodecFactoryType.GetMethod("CreatePlugin", BindingFlags.Instance|BindingFlags.Public); 

plugInstance = plugFactoryCreate.Invoke(plugImageCodecFactory, null); 

if (plugInstance is IImageCodecPlugin) 
    RegisterPlugin((IImageCodecPlugin)plugInstance); 

답변

4

AssemblyVersion 대 ​​AssemblyFileVersion 사용에 대한 자세한 내용은 다음 질문과 대답을 읽어보십시오.

Ignoring build numbers when referencing DLLs

Differences between AssemblyVersion and AssemblyFileVersion

짧은 버전

는 새 버전을 취할 부양을 강제 해당 어셈블리에 잠재적으로 파괴 변화를 소개 할 때 만 AssemblyVersion를 변경해야한다는 것입니다.

사소한 변경 사항은 AssemblyFileVersion을 사용하여 차이점을 표시 할 수 있습니다.

정적 어셈블리 버전을 개발 용으로 사용하고 안정적인 릴리스로 전환 할 때 증가시켜 앞으로 관리하고 향후 버전 증분을 수동으로 관리 할 수 ​​있습니다.

0

는, 플러그인해야 기본 라이브러리에 대한 컴파일러 오류 회담과 같은 플러그인에 관련된 아무것도, 당신은 플러그인 기반 아키텍처를 구현하는 것이 고려가 없다 사용하여로드 게으름을 완전히 채워 넣었습니다. 그래서 플러그인 로딩 문제가 있어도 런타임에 컴파일하고 시간을 컴파일하지 않아도됩니다.

나를 위해 원인은 어셈블리 버전입니다.

감사합니다.

+0

기본 라이브러리 재 컴파일의 경우에도 플러그인이로드되고 올바르게 실행됩니다. 기본 리비전 대신 버전 리비전을 68로 고정합니다. 그렇다면 플러그인로드에 대한 개정을 어떻게 무시합니까? 주 버전과 부 버전에서만 이진 변경 사항을 표시하고 싶습니다. – Luca

+0

그냥 0으로두면 문제가 생깁니 까? – Tigran

+0

버전 개정은 소스/2 진 릴리스를 식별합니다. 개정판을 변경하려면 모든 플러그인 재 컴파일 (및 배포)이 필요합니다. – Luca

1

Visual Studio를 사용한다고 가정하면 플러그인 프로젝트 중 하나에서 참조를 확인하십시오. 기본 라이브러리에 대한 참조 속성을 보면 SpecificVersion 플래그가 무엇으로 설정되어 있습니까? False으로 설정하여 차이가 있는지 확인하십시오.

프로젝트가 컴파일 된 DLL에 대한 직접적인 참조가 아닌 프로젝트 참조를 사용하는 경우이 플래그는 표시되지 않습니다. 이 경우 시도한 것처럼 기본 라이브러리에서 고정 된 개정 번호를 사용해야하거나 DLL에 대한 직접 참조를 사용하여 SpecificVersion 속성을 변경할 수 있습니다.

+1

파일 참조에 Debug/Release/x86/x64 컴파일이 표시되지 않습니다. 그러나 Juozas Kontvainis의 대답은 http://stackoverflow.com/questions/915712/how-to-set-specific-version-property-for-project-references-in-visual-studio에서이 방향으로 문제를 멋지게 해결할 수 있습니다. – Luca

+0

@ 루카 박람회는 OP가 다른 편집, 유용한 정보에 관해서 묻지 않았지만 충분했다. – RobV