Skip to content

Implement IL2C specialized tfm #116

@kekyo

Description

@kekyo

I was thinking that an IL2C-specific tfm would have to be defined at some point, but the sooner the better.
With #79, now that we have a fully automatic build, I think we will have more opportunities to try IL2C closer to home. In that case, if we had our own tfm, we could easily detect the "is this supported?" that has been raised several issues in the past.

NET developers routinely switch tfm to detect if an API is supported or not (maybe it's just me). For example :

var address = await Dns.GetHostAddressesAsync("www.google.com", token);

Overloading is only available in .NET 6 and above. To discover this early, use :

<PropertyGroup>
  <TargetFrameworks>net48;net6.0</TargetFrameworks>

by using multiple targets, the developer can detect this overload as an unresolvable problem for net48 at compile time.

Digging deeper, net48 and net6.0 will cause implicit references to libraries, especially mscorlib and System.Private.CoreLib (or System.Runtime) assemblies, to switch between defined and undefined symbols, which will be reflected in successful compilation. Also, in the case of external libraries, NuGet interprets these tfm's to include the appropriate package's libraries in the project's dependent libraries, which switches symbols between defined and undefined in the same way.

As an introduction to IL2C-specific tfm :

  • Resolving tfm names like netil2c1.0 (not sure how, hope it is not hard-coded somewhere in NuGet's library or in MSBuild's scripts or tasks...)
  • If an IL2C tfm is specified and built, have a stub assembly like il2ccorlib.dll linked in as a standard library. The contents should be empty or always throw an exception.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions