问题描述
根据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.DefineDynamicAssembly
,AssemblyBuilderAccess.RunAndSave
或AssemblyBuilder.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