-
Notifications
You must be signed in to change notification settings - Fork 44
Add support for Rust #214
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Add support for Rust #214
Changes from 15 commits
Commits
Show all changes
24 commits
Select commit
Hold shift + click to select a range
a7d7c90
Add Rust as an alternative output language for DNNE
AaronRobinsonMSFT cc36213
Add Rust Cargo crate generation and ImportingProcess.Rust test
AaronRobinsonMSFT 8999ba0
Update README to include Rust toolchain and examples for native exports
AaronRobinsonMSFT c8658c2
Apply suggestions from code review
AaronRobinsonMSFT 4a95259
Enhance Rust crate generation by updating cleanup rules and adding cr…
AaronRobinsonMSFT b282bad
Apply suggestions from code review
AaronRobinsonMSFT d732288
Apply suggestions from code review
AaronRobinsonMSFT e3f4dec
Refactor project files to use variables for target framework and vers…
AaronRobinsonMSFT b5af00a
Build test.proj in CI
AaronRobinsonMSFT 354d5b8
Fix linux path
AaronRobinsonMSFT a3c55bf
Fix Windows build
AaronRobinsonMSFT ca7a0fa
Update build configuration to conditionally disable package building …
AaronRobinsonMSFT 6c3f841
Cargo release build.
AaronRobinsonMSFT 3bc3204
Update abort handling in Rust platform module to use standard abort f…
AaronRobinsonMSFT 3f1a1c2
Update README to clarify sample directory structure and Rust example …
AaronRobinsonMSFT c3253aa
Refactor various files
AaronRobinsonMSFT 6830f9b
Review feedback
AaronRobinsonMSFT 559d4cf
Incorrect argument to setup rust toolchain
AaronRobinsonMSFT 6e09886
Remove Rust targeting on Windows.
AaronRobinsonMSFT 6eed37c
Disable .NET 4.7.2 builds when using Rust.
AaronRobinsonMSFT b71a8a9
Build break.
AaronRobinsonMSFT 48a3487
Update Rust export paths and add new input files for incremental builds
AaronRobinsonMSFT 56a47db
Add safe identifier handling for Rust keywords in RustEmitter
AaronRobinsonMSFT 9a878a9
Apply suggestions from code review
AaronRobinsonMSFT File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| # Copilot Instructions for DNNE | ||
|
|
||
| DNNE (Dotnet Native Exports) enables .NET managed assemblies to expose native exports consumable by native code. It generates C or Rust source from assemblies marked with `[UnmanagedCallersOnly]` and compiles them into platform-specific native binaries (`.dll`, `.so`, `.dylib`). | ||
|
|
||
| ## Build & Test | ||
|
|
||
| ```bash | ||
| # Build the NuGet package (includes all components) | ||
| dotnet build src/create_package.proj | ||
|
|
||
| # Run all unit tests | ||
| dotnet test test/DNNE.UnitTests | ||
|
|
||
| # Run a single test by name | ||
| dotnet test test/DNNE.UnitTests --filter "FullyQualifiedName~TestMethodName" | ||
|
|
||
| # Test with alternative compilers (useful for cross-compiler validation) | ||
| dotnet test test/DNNE.UnitTests -p:BuildWithGCC=true | ||
| dotnet test test/DNNE.UnitTests -p:BuildAsCPPWithMSVC=true | ||
| dotnet test test/DNNE.UnitTests -p:BuildWithClangPP=true | ||
| ``` | ||
|
|
||
| The test framework is **xUnit**. Tests target `net8.0` (and `net472` on Windows). | ||
|
|
||
| ## Architecture | ||
|
|
||
| The project has a pipeline architecture where each component feeds into the next: | ||
|
|
||
| 1. **dnne-analyzers** (`src/dnne-analyzers/`) — Roslyn source generator that emits the DNNE attribute types into consuming projects at compile time. Targets `netstandard2.0` and requires Roslyn 4.0+. Generated attributes include: | ||
| - `ExportAttribute`, `C99DeclCodeAttribute`, `C99TypeAttribute` — for C99 output | ||
| - `RustDeclCodeAttribute`, `RustTypeAttribute` — for Rust output | ||
|
|
||
| 2. **dnne-gen** (`src/dnne-gen/`) — CLI tool (.NET 8.0) that reads a compiled managed assembly via reflection, finds methods marked with `[UnmanagedCallersOnly]` or `[DNNE.Export]`, and generates native source code with the corresponding export signatures. Supports two output languages selected via `-l`: | ||
| - `c99` (default) — generates C99 source with `DNNE_API` macros, C preprocessor platform guards, and lazy-init function pointer wrappers. | ||
| - `rust` — generates Rust source with `pub unsafe fn` wrappers intended for Rust callers (no `extern "C"` / `#[no_mangle]`), `AtomicPtr` lazy initialization, `#[cfg(target_os)]` platform guards, and `core::ffi` types. | ||
|
|
||
| The `Generator` class uses language-specific type providers (`C99TypeProvider` / `RustTypeProvider`) and emitters (`EmitC99` / `EmitRust`). Attribute detection is unified through `TryGetLanguageTypeAttributeValue` and `TryGetLanguageDeclCodeAttributeValue`, which select C99 or Rust attributes based on the output language. Exports with non-primitive value types that lack a type override are skipped in Rust mode. | ||
|
|
||
| 3. **MSBuild integration** (`src/msbuild/`) — `DNNE.props` defines configurable properties; `DNNE.targets` wires up the build pipeline (run dnne-gen, then invoke the native compiler). `DNNE.BuildTasks/` contains custom MSBuild tasks with platform-specific compilation logic in `Windows.cs`, `Linux.cs`, and `macOS.cs`. | ||
|
|
||
| 4. **Platform layer** (`src/platform/`) — Native source that bootstraps the .NET runtime via `nethost` and dispatches calls to managed exports. | ||
| - `platform.c` / `dnne.h` — C implementation with platform-conditional code (`#ifdef DNNE_WINDOWS` etc.) for library loading, path resolution, error state preservation, and thread-safe runtime initialization via spinlock. | ||
| - `platform_v4.cpp` — .NET Framework v4.x activation (C++ only). | ||
| - `platform.rs` — Rust implementation targeting .NET (Core) only. Uses `std::sync::Mutex` for thread-safe initialization, platform-specific `sys` modules for Unix/Windows, and a UTF-8 public API (`*const u8`) with internal wide-string conversion on Windows. Expects a crate-root constant `DNNE_ASSEMBLY_NAME` (for example, generated into `lib.rs` by `DNNE.targets`). | ||
|
|
||
| 5. **dnne-pkg** (`src/dnne-pkg/`) — Orchestrates NuGet package creation, bundling analyzers, gen tool, build tasks, and platform source into the published package. | ||
|
|
||
| ## Key Conventions | ||
|
|
||
| - Exported methods must be `public static` and marked with `[UnmanagedCallersOnly]` (preferred) or `[DNNE.Export]` (experimental). The enclosing class's accessibility doesn't matter. | ||
| - When using `[DNNE.Export]`, a companion `Delegate` type named `<MethodName>Delegate` must exist at the same scope. | ||
| - Custom native type mappings use language-specific attributes: | ||
| - **C99**: `[DNNE.C99Type("...")]` on parameters/return values and `[DNNE.C99DeclCode("...")]` on methods for struct definitions or `#include` directives. | ||
| - **Rust**: `[DNNE.RustType("...")]` on parameters/return values and `[DNNE.RustDeclCode("...")]` on methods for type definitions or `use` statements. | ||
| - The generated native binary is named `<AssemblyName>NE` by default (suffix controlled by `DnneNativeBinarySuffix` MSBuild property). | ||
| - MSBuild properties controlling behavior are defined in `src/msbuild/DNNE.props` — this is the reference for all DNNE configuration options. | ||
| - C# language version varies by component: `C# 11.0` for analyzers, `C# 9.0` for build tasks, default for other projects. | ||
| - The DNNE attribute types are source-generated into consuming projects — DNNE provides no assembly reference. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,6 +2,7 @@ | |
|
|
||
| **/bin/ | ||
| **/obj/ | ||
| **/target/ | ||
| **/*.user | ||
| **/launchSettings.json | ||
|
|
||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| <Project> | ||
| <PropertyGroup> | ||
| <DnneTargetFramework>net8.0</DnneTargetFramework> | ||
| <DnneVersion>2.0.8</DnneVersion> | ||
|
|
||
| <RepoRoot>$(MSBuildThisFileDirectory)/</RepoRoot> | ||
| <SrcRoot>$(RepoRoot)src/</SrcRoot> | ||
| </PropertyGroup> | ||
| </Project> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.