Magnet 1.0.4
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package Magnet --version 1.0.4
NuGet\Install-Package Magnet -Version 1.0.4
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Magnet" Version="1.0.4" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Magnet --version 1.0.4
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Magnet, 1.0.4"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Magnet as a Cake Addin #addin nuget:?package=Magnet&version=1.0.4 // Install Magnet as a Cake Tool #tool nuget:?package=Magnet&version=1.0.4
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
<p align="center" > <span>Magnet</span> </p> <div align=center><img src="icon.png"></div>
What is Magnet?
Magnet是基于“Microsoft.CodeAnalysis.CSharp.Scripting”开发一个高性能的c#游戏脚本引擎
<br/>
Magnet is based on "Microsoft.CodeAnalysis.CSharp.Scripting" to develop a high performance c # game Script engine
在c#语言和NET框架下,脚本具有安全、可控、灵活、状态好等特点
<br/>
On the basis of C# language and.NET framework, the script is safe, controllable, flexible and state
Features|功能
- Load from file | 从文件编译加载脚本、从程序集加载脚本、仅编译脚本
- Rewrite Type | 提供类型重写器以替换脚本内使用的类型
- Unload | 脚本程序集卸载
- Disable Namespace | 禁用命名空间
- Script state isolation | 脚本状态隔离
- Script dependency injection | 脚本依赖注入
- Debugger and braek; | 调试和断点
- Output assembly | 输出程序集
- References assembly | 增加引用程序集
- Generation method delegate | 生成方法委托
- Illegal API detection | 非法API检测
- Global variable | 全局变量
- Expandability | 可扩展性
- Script inter call | 脚本之间调用
- Custom Analysis | 自定义分析器扩展
Examples|例子
private static ScriptOptions Options(String name)
{
ScriptOptions options = ScriptOptions.Default;
// 脚本名称
options.WithName(name);
// 调试模式 不启用脚本内置debugger()函数
options.WithDebug(false);
// 发布模式 编译优化
//options.WithRelease();
// #1 仅编译,可输出
options.WithCompileKind(CompileKind.Compile);
options.WithOutPutFile("123.dll");
// #2 从程序集文件加载
options.WithCompileKind(CompileKind.LoadAssembly);
options.WithScanDirectory("./");
options.WithAssemblyFileName("123.dll");
// #3 从脚本文件编译并加载
options.WithCompileKind(CompileKind.CompileAndLoadAssembly);
options.WithScanDirectory("../../../../Scripts");
// 定义自定义的编译宏符号
options.WithCompileSymbols("USE_FILE");
// 是否支持异步
options.WithAllowAsync(false);
// 添加程序集引用
options.AddReferences<GameScript>();
var timerProvider = new TimerProvider();
// 增加一个分析器
options.AddAnalyzer(timerProvider);
// 替换类型
options.AddReplaceType(typeof(Task), typeof(Task));
// 禁用类型
options.DisableType(typeof(Task));
// 禁用命名空间
options.DisableNamespace(typeof(Thread));
//禁用不安全类型与命名空间
options.DisableInsecureTypes();
// 脚本类型重写器
options.WithTypeRewriter(new TypeRewriter());
// 使用默认的抑制诊断
options.UseDefaultSuppressDiagnostics();
// 脚本上下文依赖程序集加载Hook
options.WithAssemblyLoadCallback(AssemblyLoad);
// 注册依赖注入
options.RegisterProvider(timerProvider);
options.RegisterProvider<ObjectKilledContext>(new ObjectKilledContext());
options.RegisterProvider(GLOBAL);
options.RegisterProvider<IObjectContext>(new HumContext(), "SELF");
return options;
}
private static WeakReference<Action> TestScriptUnload()
{
MagnetScript scriptManager = new MagnetScript(Options("Unload.Test"));
var result = scriptManager.Compile();
if (!result.Success)
{
foreach (var item in result.Diagnostics)
{
Console.WriteLine(item.ToString());
}
return null;
}
var state = scriptManager.CreateState();
var weak = state.MethodDelegate<Action>("ScriptExample", "Hello");
state.Dispose();
scriptManager.Unload();
return weak;
}
public static void Main()
{
MagnetScript scriptManager = new MagnetScript(Options("My.Script"));
scriptManager.Unloading += ScriptManager_Unloading;
scriptManager.Unloaded += ScriptManager_Unloaded;
var result = scriptManager.Compile();
foreach (var diagnostic in result.Diagnostics)
{
Console.WriteLine(diagnostic.ToString());
}
if (result.Success)
{
var stateOptions = StateOptions.Default;
stateOptions.RegisterProvider(new TimerService());
var stateTest = scriptManager.CreateState(stateOptions);
var weakMain = stateTest.MethodDelegate<Action>("ScriptA", "Main");
if (weakMain != null && weakMain.TryGetTarget(out var main))
{
using (new WatchTimer("With Call Main()")) main();
main = null;
}
var weakPlayerLife = stateTest.ScriptAs<IPlayLifeEvent>();
if (weakPlayerLife != null && weakPlayerLife.TryGetTarget(out var lifeEvent))
{
using (new WatchTimer("With Call OnOnline()")) lifeEvent.OnOnline(null);
lifeEvent = null;
}
stateTest = null;
scriptManager.Unload(true);
}
// wait gc unloaded assembly
while (scriptManager.Status == ScriptStatus.Unloading && scriptManager.IsAlive)
{
var obj = new byte[1024 * 1024];
Thread.Sleep(10);
}
}
private static void ScriptManager_Unloaded(MagnetScript obj)
{
Console.WriteLine($"脚本[{obj.Name}:{obj.UniqueId}]卸载完毕.");
}
private static void ScriptManager_Unloading(MagnetScript obj)
{
Console.WriteLine($"脚本[{obj.Name}:{obj.UniqueId}]卸载请求.");
}
Script Examples|脚本例子
using Magnet.Core;
using System;
// A usable script must meet three requirements.
// 1. The access must be public
// 2. The [ScriptAttribute] must be marked
// 3. The AbstractScript class must be inherited
[Script(nameof(ScriptExample))]
public class ScriptExample : AbstractScript
{
[Autowired("SELF")]
protected readonly IObjectContext? SELF;
[Autowired]
protected readonly GlobalVariableStore? GLOBAL;
[Function("Hello")]
public void Hello()
{
this.PRINT($"Hello Wrold!");
// call script method
Call("ScriptB", "Test", []);
Call("ScriptB", "PrintMessage", ["Help"]);
TryCall("ScriptB", "PrintMessage1", ["Help"]);
Script<ScriptB>().PrintMessage("AAA");
Script<ScriptB>((script) =>
{
script.PrintMessage("BBB");
});
}
public Double Target
{
get
{
return 3.14;
}
set
{
this.PRINT(value);
}
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net8.0
- Magnet.Core (>= 1.0.4)
- Microsoft.CodeAnalysis.CSharp.Scripting (>= 4.11.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.