在F#项目中找不到AssemblyBuilder方法

问题描述

根据https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.assemblybuilder?view=netcore-3.0,我试图使用AssemblyBuilder以便以F#生成程序集。问题在于那里描述的许多方法和属性不可用。

编辑:从F#交互式程序运行时,以下代码有效,但是Visual Studio仍然抱怨找不到其他方法。

open System
open System.Reflection
open System.Reflection.Emit

let generateAssembly (program: CILProgram) (fileName: string) : unit = 
    let assemblyName = new AssemblyName ("name")
    let assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName,AssemblyBuilderAccess.RunAndSave)
    assemblyBuilder.Save("name")
;;

例如,AppDomain.CurrentDomain.DefineDynamicAssemblyAssemblyBuilderAccess.RunAndSaveAssemblyBuilder.Save不可用,我是否使用其他版本?这是我的.fsproj文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>

    <IsPackable>false</IsPackable>
    <GenerateProgramFile>false</GenerateProgramFile>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="nunit" Version="3.12.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.13.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
  </ItemGroup>

  <ItemGroup>
    <Compile Include="AbstractSyntax.fs" />
    <Compile Include="Parser.fs" />
    <Compile Include="Lexer.fs" />
    <Compile Include="Helpers.fs" />
    <Compile Include="TypeChecker.fs" />
    <Compile Include="CILCompiler.fs" />
    <Compile Include="CILGenerator.fs" />
    <Compile Include="Program.fs" />
    <Compile Include="ParserTest.fs" />
    <Compile Include="TypeCheckerTest.fs" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="FsLexYacc.Runtime">
      <HintPath>..\..\..\source\FsLexYacc\tests\LexAndYaccMiniProject\bin\Debug\net46\FsLexYacc.Runtime.dll</HintPath>
    </Reference>
  </ItemGroup>

</Project>

解决方法

<TargetFramework>netcoreapp3.0</TargetFramework>

问题不在于F#,而是.NET Core。这些方法尚未移植,请参见Is there any replace of AssemblyBuilder.DefineDynamicAssembly in .NET Core?

例如,RunAndSave is supported in .NET 4.8(。NET Framework的最新版本)。

但是它是not supported in .NET Core,甚至是.NET 5.0。关于此问题的讨论可以追溯到2015年,this proposal提供了信息,并提到了.NET 5.0并未考虑使用它。您还可以在受支持的resolution of Regex.CompileToAssembly中看到它,但是奇怪的是,它还没有保存该程序集。

请注意,您仍然可以使用DefineDynamicAssembly,但无法保存它,see here。如果您可以重写代码以使用Framework,那将解决您的问题。

,

通过此doc,不支持AppDomain.CurrentDomain.DefineDynamicAssembly

替换为AssemblyBuilder.DefineDynamicAssembly

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...