1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//! Generates C# bindings for [Interoptopus](https://github.com/ralfbiedert/interoptopus).
//!
//! # Usage
//!
//! Assuming you have written a crate containing your FFI logic called `example_library_ffi` and
//! want to generate **C# bindings**, follow the instructions below.
//!
//! ### Inside Your Library
//!
//! Add [**Interoptopus**](https://crates.io/crates/interoptopus) attributes to the library you have
//! written, and define an inventory function listing all symbols you wish to export. An overview of all
//! supported constructs can be found in the
//! [**reference project**](https://github.com/ralfbiedert/interoptopus/tree/master/crates/reference_project/src).
//!
//!```rust
//! use interoptopus::{ffi_function, ffi_type, function};
//! use interoptopus::inventory::{Inventory, InventoryBuilder};
//!
//! #[ffi_type]
//! pub struct Vec2 {
//! pub x: f32,
//! pub y: f32,
//! }
//!
//! #[ffi_function]
//! pub fn my_function(input: Vec2) -> Vec2 {
//! input
//! }
//!
//! pub fn my_inventory() -> Inventory {
//! Inventory::builder()
//! .register(function!(my_function))
//! .validate()
//! .build()
//! }
//! ```
//!
//!
//! Add these to your `Cargo.toml` so the attributes and the binding generator can be found
//! (replace `...` with the latest version):
//!
//! ```toml
//! [lib]
//! crate-type = ["cdylib", "rlib"]
//!
//! [dependencies]
//! interoptopus = "..."
//! interoptopus_backend_csharp = "..."
//! ```
//!
//! Create a unit test in `tests/bindings.rs` which will generate your bindings when run
//! with `cargo test`. In real projects you might want to add this code to another crate instead:
//!
//!```
//! use interoptopus::Error;
//! use interoptopus::lang::NamespaceMappings;
//!
//! #[test]
//! fn bindings_csharp() -> Result<(), Error> {
//! use interoptopus_backend_csharp::{Config, Generate};
//!
//! let config = Config {
//! dll_name: "example_library".to_string(),
//! namespace_mappings: NamespaceMappings::new("My.Company"),
//! ..Config::default()
//! };
//!
//! Generator::new(config, example_library_ffi::my_inventory())
//! //.add_overload_writer(Unity::new())
//! .write_file("bindings/csharp/Interop.cs")?;
//!
//! Ok(())
//! }
//! ```
//!
//! Now run `cargo test`.
//!
//! If anything is unclear you can find a [**working sample on Github**](https://github.com/ralfbiedert/interoptopus/tree/master/examples/hello_world).
//!
//! ### Generated Output
//!
//! The output below is what this backend might generate. Have a look at the [`Interop`](crate::Interop) struct
//! if you want to customize something. If you really don't like how something is generated it is
//! easy to [**create your own**](https://github.com/ralfbiedert/interoptopus/blob/master/FAQ.md#new-backends).
//!
//! ```csharp
//!using System;
//!using System.Collections;
//!using System.Collections.Generic;
//!using System.Runtime.InteropServices;
//!using My.Company;
//!
//! namespace My.Company
//! {
//! public static partial class InteropClass
//! {
//! public const string NativeLib = "example_library";
//!
//! /// Function using the type.
//! [LibraryImport(NativeLib, EntryPoint = "my_function")]
//! public static extern Vec2 my_function(Vec2 input);
//! }
//!
//! /// A simple type in our FFI layer.
//! [Serializable]
//! [StructLayout(LayoutKind.Sequential)]
//! public partial struct Vec2
//! {
//! public float x;
//! public float y;
//! }
//! }
//! ```
pub
pub
pub use ;
pub use ;
use template_engine;
template_engine!;