我有一个应用程序,它基本上是一个带有预加载控件的设计器,您可以使用控件设计页面.
我打算将来发布越来越多的控件.我不想为新添加的控件发布新版本,因为它有它的缺点.所以我在考虑添加/插件类型的架构,我只是单独发布它们可以安装的插件/插件,并获得设计器内的控件.
现在我使用xml文件作为插件来指定控件,它的行为,它的样式等.每个xml(addon)代表一个控件.但我发现很难实现这个,因为我要编写一个通用的解析器来读取所有的插件.
相反,我可以为每个插件释放一个dll,这使我能够更好地控制编写代码来定义控件的行为/外观并通过主引擎动态加载它吗?如果是这样,我如何检查dll并在我的应用程序中动态加载它?
在我的游戏中(也用C#编写)我希望包含某种自定义支持.速度是一个很大的问题因为我打算将游戏的主要部分卸载到脚本中.因此,我选择使用C#来编写游戏事件和内容的脚本.用户还应该能够在C#中为游戏编写脚本和插件.(我知道C#不是一种脚本语言.)
我将为用户提供一个(静态)类,其中包含与游戏交互所需的所有功能.用户还可以提供代码作为源代码(在这种情况下游戏将编译它). 在某些情况下,编译的用户"脚本"也可以/将被传输给其他玩家.例如,用户可以在他的家中或其他任何地方构建脚本陷阱.
这是我的问题:
安全
如何确保所提供的代码仅被强制调用所提供的API(类)的内容?为了防止欺骗脚本,恶意活动......
有没有办法在某种VM或低信任环境中运行已编译的代码?
速度
这种方法会足够快吗?(每隔一帧或每隔一帧调用多达100个自定义程序集的功能).关于这个的任何提示?
也许通过将所有用户内容编译成一个大型组件或其他任何东西来获得速度优势?
尺寸
如何使编译后的代码变小(除了压缩它)?因为玩家可能需要下载数十个脚本......
有没有办法去除不是绝对必要的东西?像调试信息或类名等...
运行时编译对我来说是相当新的(这就是我在这里问的原因).因此,指出一些重大的初学者错误和/或安全问题会很好.
只是为了澄清:用户插件/脚本或任何你想要调用它的类将是一个类(也用C#编写),它必须实现特定的功能,如"GetAddonInfo","Init","Update"...就像一个普通的C#类,派生自我的抽象"Addon"类.
人们在没有重新编译的情况下找到/用于向.NET/C#应用程序添加功能的方式有哪些?
我想到的方法是让代码查找要读取的文件,解析该文件,然后根据文件中包含的内容(可能是xml文件)动态创建控件及其事件处理程序等. .
或者会动态加载.DLL被视为"不重新编译"?
任何想法/"战争故事"?
我有2个程序集,A包含Main方法和Foo类,它使用Bar来自程序集B的类:
杆组件(组件B):
public sealed class Bar : IDisposable {
/* ... */
public void Dispose() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
Foo类(程序集A):
public class Foo : IDisposable {
private readonly Bar external;
private bool disposed;
public Foo()
{
Console.WriteLine("Foo");
external = new Bar();
}
~Foo()
{
Console.WriteLine("~Foo");
this.Dispose(false);
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed) return;
if (disposing) external.Dispose();
disposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
入口点(在程序集A中):
class Program
{
static void Main(string[] …
Run Code Online (Sandbox Code Playgroud) c# ×4
.net ×3
asp.net ×1
compilation ×1
dll ×1
dynamic ×1
finalizer ×1
idisposable ×1
scripting ×1
security ×1