문제

두 가지 버전의 DLL에서 작업 해야하는 응용 프로그램이 있습니다. 앱을 한 번 컴파일하고 EXE를 두 디렉토리로 복사 한 다음 두 버전의 DLL을 각 디렉토리에 복사 할 것이라고 생각했습니다. 참고, 나는 GAC와 아무것도하지 않습니다. 그러나 DLL이 컴파일되지 않은 버전에서 fileloadexception을 받고 있습니다.

이 프로젝트에는 DLL 참조에 대해 "특정 버전"이 False로 설정되어 있습니다. 그러나 아마도 그것은 잘못된 설정 일 것입니다. 여러 버전으로 작동하도록하려면 어떻게해야합니까?

도움이 되었습니까?

해결책 4

구성 파일을 변경하는 것에 대해 통치했습니다. 단순히 내가해야 할 또 다른 일이기 때문입니다. 다른 버전의 DLL에 대한 주소 변경과 관련하여, 나는 실제로 내 메소드를 호출하기 위해 인터페이스를 사용하고 있기 때문에 그 문제가 있다고 생각하지 않습니다.

좀 더 자세히 설명하려면 여러 DLL에서 한 유형의 인스턴스를 만들면됩니다. 거기에서 나는 그것을 인터페이스 객체로 취급합니다. 그래서 여기 내 해결책이 있습니다.

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll");
Type type = asm.GetType("MyType");
IMyType obj = Activator.CreateInstance(type) as IMyType;

이것은 작동하는 것 같습니다.

다른 팁

참조중인 어셈블리에 강력하게 서명하면 CLR이 컴파일 된 버전과 다른 버전을 가지고 있으면로드하지 않습니다. 이 경우 구성 파일을 사용하여 사용하려는 버전을 지정할 수 있습니다.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YouAssemblyNameWithoutDotDll"
                              publicKeyToken="your-assembly-token"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

물론 이것은 새로운 버전의 어셈블리가 동일한 방법 서명을 가지고 있다고 가정합니다. MissingMethodexception 런타임에.

DLL을 다시 컴파일 할 때마다 함수가 변경되기 때문입니다. 또한 DLL과 함께 컴파일 시간에 앱을 바인딩하기 때문에 앱에서 앱에 고정되도록 설정됩니다. 기본적으로 새로운 버전의 DLL (또는 데이터를 엉망으로 만들 때 더 정확하게) 또는 동적로드 및 GetProcadDress를 사용하여 프로그램을 매번 다시 컴파일해야합니다.

어셈블리의 두 버전에 AssemblyInfo.cs 파일에 동일한 어셈블리 버전이 지정되어 있는지 확인하십시오.

전:

[assembly: AssemblyVersion("1.0.0.0")]

2008 대 VS 이전의 새로운 프로젝트에 대한 기본값은 다음과 같습니다.

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

어셈블리 버전이 구축 될 때마다 자동으로 증가합니다.

이것은 특히 중요합니다 서명 된 어셈블리 어셈블리의 강력한 이름에는 버전이 포함되어 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top