Cómo generar tipos compatibles con C #, amigables con .Net 4.0 usando proveedores de tipo F # 3.0

Quiero generar tipos "fuertes" basados ​​en orígenes de datos escritos "débilmente", utilizando el mecanismo de proveedor de tipo F # 3.0. Los tipos generados deben ser accesibles desde los clientes de C # en un entorno donde solo .Net 4.0 está instalado, pero no .Net 4.5. Si la compatibilidad con .Net 4.0 no es posible, no podemos utilizar proveedores de tipo en nuestro proyecto actual de ERP a gran escala.

Hasta ahora, he logrado crear MyGeneratedTypes.dll siguiendo eltutorial en msdn (sección "Proporcionar tipos generados"), usando elProvidedTypeDefinition de "ProvisedTypes-0.2.fs", que forma parte del paquete de muestra F # 3.0. (Para que funcione, tuve que quitar la línea "File.Delete..." desde el "ProvidedTypeDefinition.ConvertToGenerated... "método).

MyGeneratedTypes.dll tiene una versión v4.0.30319 en tiempo de ejecución, que está bien (el tiempo de ejecución de .Net 4.0). Puedo agregar una referencia a MyGeneratedTypes.dll en una aplicación C # /. Net 4.0, e IntelliSense muestra los tipos y miembros como se esperaba. Sin embargo, cuando intento compilar, el compilador de C # falla y produce la 'advertencia MSB3258: la referencia principal "MyGeneratedTypes" no se pudo resolver porque tiene una dependencia indirecta del ensamblado de .NET Framework "FSharp.Core, Version = 4.3.0.0 , Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a "que tiene una versión más alta" 4.3.0.0 "que la versión" 4.0.0.0 "en el marco objetivo actual. '

Un vistazo a IL Spy confirma que MyGeneratedTypes.dll contiene una referencia a FSharp.Core 4.3, aunque esta referencia es completamente innecesaria. Hasta ahora, no he encontrado ninguna manera de evitar que el compilador F # coloque esta referencia en el ensamblado generado. (Entre otras cosas, he creado un ensamblaje .Net 4.0 puro en C # y se lo pasé al constructor deProvidedTypeDefinition, pero esto no tiene influencia).

Alguien sabe a) cómo deshacerse de la referencia, o b) si esto es solo un problema candidato de la versión F # 3.0, que se resolverá en la versión final.

Editar

La conversación con @Brian ha dado como resultado la siguiente solución "parcial" al problema: Ustedpuede compile un cliente "puro C # /. Net 4.0" que haga referencia a una biblioteca con tipos generados con F # 3.0, pero solo llamando al compilador .Net 4.0 C #csc) directamentedesde la linea de comando. No funciona al compilar en VS 2010 o a través de la línea de comandos de MSBuild. Sospecho que esto es causado por el siguiente comportamiento:

MyGeneratedTypes.dll se genera en VS 2012 con el mecanismo del proveedor de tipo F #.Durante la generación, se inserta automáticamente una referencia a FSharp.Core 4.3 (incluso si no es necesaria), sin especificar "Versión específica: verdadera "en los metadatos de la dependencia.Un cliente C # en VS 2010 en un sistema ".Net 4.5-free" hace referencia a MyGeneratedTypes.dll.Cuando se compila el cliente C #, MSBuild descubre la referencia indirecta a FSharp.Core 4.3 dentro de MyGeneratedTypes.dll.Debido a que la referencia indirecta existe con "SpecificVersion: false", MSBuild emite la advertenciaMSB3257 y se niega a pasar la referencia directa /r:"MyGeneratedTypes.dll "al compilador de C # (csc). (Nota: las advertencias de MSBuild no se pueden suprimir de ninguna manera).MSBuild llama al compilador de C # (csc), sin /r:"MyGeneratedTypes.dll ". Por lo tanto, no se puede compilar y emite el error de compilador CS0246: "No se pudo encontrar el tipo o el nombre del espacio de nombres 'MyGeneratedTypes' (...)".

Por lo que puedo decir, estamos atascados con este problema a menos que se modifique el mecanismo del proveedor de tipo F # a) para excluir la referencia a FSharp.Core 4.3 cuando no sea necesario en un ensamblaje generado, o b) para incluir la ref con los metadatos "SpecificVersion:true".

Respuestas a la pregunta(1)

Su respuesta a la pregunta