1

I am trying to use an AssemblyBuilder, in order to generate an assembly in F#, according to https://learn.microsoft.com/en-us/dotnet/api/system.reflection.emit.assemblybuilder?view=netcore-3.0 . The problem is that many of the methods and properties described there are not available.

Edit: the following code works when run from F# interactive, but Visual Studio still complains that it cannot find different methods.

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")
;;

For example, AppDomain.CurrentDomain.DefineDynamicAssembly, AssemblyBuilderAccess.RunAndSave or AssemblyBuilder.Save are not available, am I using a different version? This is my .fsproj file:

<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>
AndreiXwe
  • 723
  • 4
  • 19

2 Answers2

3

<TargetFramework>netcoreapp3.0</TargetFramework>

The problem is not with F#, but with .NET Core. Those methods have not been ported, see Is there any replace of AssemblyBuilder.DefineDynamicAssembly in .NET Core?.

For instance, RunAndSave is supported in .NET 4.8 (the last .NET Framework version).

But it is not supported in .NET Core, or even .NET 5.0. There has been discussion on this dating back to 2015, and this proposal has info and a mention that it wasn't considered for .NET 5.0. You can also see it in the resolution of Regex.CompileToAssembly, which is supported but, curiously, doesn't yet save the assembly..

Note that you can still use DefineDynamicAssembly, but it cannot be saved, see here. If you can rewrite your code to use Framework, that'll solve your issue.

Abel
  • 56,041
  • 24
  • 146
  • 247
1

By this doc, there is no support for AppDomain.CurrentDomain.DefineDynamicAssembly

Replaced by AssemblyBuilder.DefineDynamicAssembly

Svirin
  • 564
  • 1
  • 7
  • 20