2012-04-09 6 views
8

필자가 이해하는 한, F # 유형 제공자는 항상 휴대용이 아닌 클래스 라이브러리가됩니다 (예 : WinRT에서 사용할 수없는 Reflection.Emit을 사용합니다). 내 F # 클래스 라이브러리에서이를 사용하려면 형식 제공자 DLL에 대한 참조를 추가해야합니다. 그러면 라이브러리를 컴파일 할 때 이식성이 없어야합니다.유형 제공자가있는 휴대용 라이브러리

이 경우에는 하나의 휴대용 어셈블리와 유형 공급자를 사용하는 어셈블리로 나누어 드리겠습니다. 이 컴파일 할 수있는 유일한 방법은 내 C# 응용 프로그램 프로젝트 (.NET 4.5)에 Fsharp.Core에 대한 참조를 추가하는 것입니다.하지만 런타임에는 FSharp.Core 버전간에 충돌이 여전히 있습니다.

{"Could not load file or assembly 'FSharp.Core, Version=2.3.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.":"FSharp.Core, Version=2.3.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"} 

은 내가 잘못 유형 제공자를 사용하고, 충돌을 해결 할 수 있거나, 아직 할 수없는 뭔가?

답변

8

app.config 파일에서 바인딩 리디렉션이 필요합니다. 4.5를 대상으로하는 새 F # 프로젝트를 만들면 app.config에

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
     <bindingRedirect oldVersion="2.3.5.0" newVersion="4.3.0.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

이 표시됩니다. 마지막 소비 exe 프로젝트 (예 : C# 1)의 app.config에 추가해야합니다. 예 : 데스크톱에서 실행하면 휴대용 FSharp.Core (2.3.5.0)가 데스크톱 하나 (4.3.0.0)로 변환됩니다.

+0

훌륭합니다. 완벽하게 작동합니다. –