Как генерировать C # -дружественные, совместимые с .Net 4.0 типы с использованием провайдеров типов F # 3.0

Я хочу создать & quot; сильный & quot; типы, основанные на "слабо" источники типизированных данных, используя механизм поставщика типов F # 3.0. Сгенерированные типы должны быть доступны клиентам C # в среде, в которой установлен только .Net 4.0, но не .Net 4.5. Если совместимость с .Net 4.0 невозможна, мы не можем использовать поставщиков типов в нашем текущем крупномасштабном проекте ERP.

До сих пор мне удалось создать MyGeneratedTypes.dll, следуяруководство на msdn (раздел «Предоставление сгенерированных типов»), используяProvidedTypeDefinition from "ProvidedTypes-0.2.fs", который является частью примера пакета F # 3.0. (Чтобы это работало, мне пришлось удалить строку & quot;File.Delete... & Quot; из & quot;ProvidedTypeDefinition.ConvertToGenerated... & Quot; метод).

MyGeneratedTypes.dll имеет рабочую версию v4.0.30319, которая в порядке (среда выполнения .Net 4.0). Я могу добавить ссылку на MyGeneratedTypes.dll в приложении C # /. Net 4.0, и IntelliSense показывает типы и элементы, как и ожидалось. Однако, когда я пытаюсь скомпилировать, компилятор C # дает сбой и выдает «предупреждение MSB3258: первичная ссылка» MyGeneratedTypes & quot; не удалось разрешить, так как он имеет косвенную зависимость от сборки .NET Framework "FSharp.Core, версия = 4.3.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a & quot; которая имеет более высокую версию "4.3.0.0"; чем версия "4.0.0.0" в текущей целевой структуре. & apos;

Взгляд на IL Spy подтверждает, что MyGeneratedTypes.dll действительно содержит ссылку на FSharp.Core 4.3, хотя эта ссылка совершенно не нужна. До сих пор я не нашел способа помешать компилятору F # поместить эту ссылку в сгенерированную сборку. (Среди прочего, я создал чистую сборку .Net 4.0 в C # и передал ее конструкторуProvidedTypeDefinition, но это не имеет никакого влияния).

Кто-нибудь знает а) как избавиться от ссылки, или б) если это только проблема-кандидат на выпуск F # 3.0, которая будет решена в финальной версии.

Edit

Разговор с @Brian привел к следующему «частичному» Решение проблемы: Выcan скомпилировать "чистый C # /. Net 4.0" клиент ссылается на библиотеку с созданными типами F # 3.0, но только путем вызова компилятора .Net 4.0 C # (csc) напрямуюfrom the command line, Он не работает при компиляции в VS 2010 или через командную строку MSBuild. Я подозреваю, что это вызвано следующим поведением:

MyGeneratedTypes.dll is generated in VS 2012 with the F# type provider mechanism. During generation, a reference to FSharp.Core 4.3 is automatically inserted (even if not needed), without specifying "SpecificVersion:true" in the metadata for the dependency. A C# client in VS 2010 on a ".Net 4.5-free" system references MyGeneratedTypes.dll. When the C# client is compiled, MSBuild discovers the indirect reference to FSharp.Core 4.3 inside MyGeneratedTypes.dll. Because the indirect reference exists with "SpecificVersion:false", MSBuild emits the warning MSB3257 and refuses to pass the direct reference /r:"MyGeneratedTypes.dll" to the C# compiler (csc). (Note: MSBuild warnings cannot be suppressed in any way.) The C# compiler (csc) is called by MSBuild, without /r:"MyGeneratedTypes.dll". Therefore, it cannot compile, and emits compiler error CS0246: "The type or namespace name 'MyGeneratedTypes' could not be found (...)".

Насколько я могу судить, мы застряли с этой проблемой, если механизм поставщика типа F # не изменен либо а) для исключения ссылки на FSharp.Core 4.3, когда она не требуется в сгенерированной сборке, либо б) для включения ссылка с метаданными & quot;SpecificVersion:true& Quot ;.

Ответы на вопрос(1)

Ваш ответ на вопрос