{"id":19675657,"url":"https://github.com/notnite/goalnet","last_synced_at":"2026-06-12T19:32:10.127Z","repository":{"id":195243211,"uuid":"692539057","full_name":"NotNite/goalnet","owner":"NotNite","description":"A payload and injector that enables easy .NET Core DLL injection","archived":false,"fork":false,"pushed_at":"2023-10-04T19:03:15.000Z","size":36,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-20T21:20:31.751Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NotNite.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-16T19:41:48.000Z","updated_at":"2024-05-24T01:06:37.000Z","dependencies_parsed_at":"2024-11-11T17:38:23.997Z","dependency_job_id":null,"html_url":"https://github.com/NotNite/goalnet","commit_stats":null,"previous_names":["notnite/goalnet"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/NotNite/goalnet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotNite%2Fgoalnet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotNite%2Fgoalnet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotNite%2Fgoalnet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotNite%2Fgoalnet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NotNite","download_url":"https://codeload.github.com/NotNite/goalnet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotNite%2Fgoalnet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34260309,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T17:25:25.586Z","updated_at":"2026-06-12T19:32:10.107Z","avatar_url":"https://github.com/NotNite.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# goalnet\n\nA payload and injector that enables easy .NET Core DLL injection.\n\n## Motivation\n\nA while ago, I was writing some injected C# code for the game FINAL FANTASY XIV. I ended up writing an injector and\nloader using [dll-syringe][dll-syringe] and [netcorehost][netcorehost], supporting the ability to unload itself. Later\non, for another game, I wanted to reuse some its features and code, so I ended up writing it again a second time.\n...then it came up a third time, and I questioned what I was doing with my life.\n\ngoalnet enables you to use C# in another process without having to think about the setup. Add a static method \u0026\ndelegate, write a config file, and then start the injector. No extra thought required.\n\n## Example\n\nLet's use the `examples/hello-goalnet` folder as an example. This project loads into Notepad, shows a message box, and\nunloads itself.\n\nTo demonstrate it in action, start Notepad, then build everything. goalnet-injector takes one argument, which is the\npath to the config file.\n\n```shell\n$ cargo build --release\n$ dotnet build --configuration Release ./examples/hello-goalnet/HelloGoalnet\n$ cargo run --release -p goalnet-injector -- ./examples/hello-goalnet/config.toml\n```\n\n## Project setup\n\nEvery project that uses goalnet requires a config file, along with some setup in the assembly itself. See the above\nexample for all values in the config file.\n\nIn the project's `.csproj`, `GenerateRuntimeConfigurationFiles` must be set to `true`. This is required for goalnet, as\nit creates a `.runtimeconfig.json` (used to determine what .NET version to use).\n\nThe assembly must have a class with an entrypoint method, along with a delegate matching the method signature. The\nentrypoint method must be static, contain no arguments, and returns `void`.\n\nWhen `unload` is set to true, the entrypoint method instead takes one argument, being an `IntPtr`/`nint` to the unload\nfunction. This can be casted into a delegate, which can be called to signal unloading the assembly from inside itself.\nThis will only work as long as the injector process is still alive and communicating with the goalnet payload.\n\nWhen `copy_build_artifacts` is set to true, the entire specified directory (along with the goalnet payload itself) is\ncopied to a temporary directory. This is wasteful, but allows you to bypass file locking issues, meaning you can cleanly\nunload and reload the assembly without having to restart the target process.\n\n[dll-syringe]: \u003chttps://github.com/OpenByteDev/dll-syringe\u003e\n[netcorehost]: \u003chttps://github.com/OpenByteDev/netcorehost\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotnite%2Fgoalnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnotnite%2Fgoalnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotnite%2Fgoalnet/lists"}