Como gerar tipos compatível com C #, compatível com .Net 4.0 usando provedores de tipo F # 3.0

Eu quero gerar tipos "fortes" com base em fontes de dados "fracamente", usando o mecanismo de provedor do tipo F # 3.0. Os tipos gerados devem ser acessíveis a partir de clientes C # em um ambiente onde apenas o .Net 4.0 esteja instalado, mas não o .Net 4.5. Se a compatibilidade com .Net 4.0 não for possível, não podemos usar provedores de tipo em nosso atual projeto ERP de larga escala.

Até agora, eu consegui criar MyGeneratedTypes.dll seguindo otutorial no msdn (seção "Fornecendo Tipos Gerados"), usando oProvidedTypeDefinition de "ProvidedTypes-0.2.fs", que faz parte do pacote de exemplo do F # 3.0. (Para que isso funcione, eu tive que remover a linha "File.Delete..." de "ProvidedTypeDefinition.ConvertToGenerated... "método).

MyGeneratedTypes.dll tem versão de tempo de execução v4.0.30319, que é OK (o tempo de execução do .net 4.0). Eu posso adicionar uma referência a MyGeneratedTypes.dll em um aplicativo C # /. Net 4.0 e IntelliSense mostra os tipos e membros conforme o esperado. No entanto, quando eu tento compilar, o compilador C # falha e produz 'aviso MSB3258: A referência primária "MyGeneratedTypes" não pôde ser resolvida porque tem uma dependência indireta no assembly do .NET Framework "FSharp.Core, versão = 4.3.0.0 , Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a "que tem uma versão superior" 4.3.0.0 "que a versão" 4.0.0.0 "no framework de destino atual. '

Uma olhada no IL Spy confirma que MyGeneratedTypes.dll realmente contém uma referência ao FSharp.Core 4.3, embora essa referência seja completamente desnecessária. Até agora, não encontrei nenhuma maneira de impedir que o compilador F # colocar essa referência no assembly gerado. (Entre outras coisas, criei um assembly puro .Net 4.0 em C # e passei-o para o construtor deProvidedTypeDefinition, mas isso não tem influência).

Alguém sabe a) como se livrar da referência, ou b) se este é apenas um problema de release candidate do F # 3.0, que será resolvido na versão final.

Editar

A conversa com @Brian resultou na seguinte solução "parcial" para o problema: Vocêposso compilar um cliente "puro C # / .net 4.0" referenciando uma biblioteca com tipos gerados F # 3.0, mas somente chamando o compilador .net 4.0 C # (csc) diretamenteda linha de comando. Ele não funciona ao compilar no VS 2010 ou via linha de comando do MSBuild. Eu suspeito que isso é causado pelo seguinte comportamento:

MyGeneratedTypes.dll é gerado no VS 2012 com o mecanismo de provedor de tipo F #.Durante a geração, uma referência ao FSharp.Core 4.3 é inserida automaticamente (mesmo que não seja necessária), sem especificar "SpecificVersion: true" nos metadados da dependência.Um cliente C # no VS 2010 em um sistema ".Net 4.5-free" referencia MyGeneratedTypes.dll.Quando o cliente C # é compilado, o MSBuild descobre a referência indireta para FSharp.Core 4.3 dentro MyGeneratedTypes.dll.Como a referência indireta existe com "SpecificVersion: false", o MSBuild emite o avisoMSB3257 e se recusa a passar a referência direta /r:"MyGeneratedTypes.dll "para o compilador C # (csc). (Nota: os avisos do MSBuild não podem ser suprimidos de qualquer forma.)O compilador C # (csc) é chamado pelo MSBuild, sem /r:"MyGeneratedTypes.dll ". Portanto, ele não pode compilar e emite o erro do compilador CS0246: "O tipo ou o nome do namespace 'MyGeneratedTypes' não pôde ser encontrado (...)".

Tanto quanto eu posso dizer, estamos presos a esse problema, a menos que o mecanismo de provedor de tipo F # seja modificado a) para excluir o ref para FSharp.Core 4.3 quando não é necessário em um assembly gerado, ou b) para incluir o ref com os metadados "SpecificVersion:true".

questionAnswers(1)

yourAnswerToTheQuestion