有一个(模块化的)游戏应用程序——竞技场,它为玩家实现了一个抽象类(或接口)。Players(游戏AI)继承自指定的类,由第三方开发者开发,以编译后的dll形式提供。是否有可能完全限制此第三方 dll 的功能?好吧,例如,为了防止“FORMAT C:”或通过网络发送数据,从磁盘读取等。即使在这种情况下属于此类,玩家也只会算作技术失败。
我在战斗,但为了我的生活,我不知道如何让它发挥作用。如何让所有第三方玩家都在沙盒中工作?现在有这样的代码:
static class PlayersHost
{
static public List<IPlayer> Players;
static public void LoadPlayers()
{
Players = new List<IPlayer>();
var files = Directory.EnumerateFiles(Path.Combine(Environment.CurrentDirectory, "Players"), "*.dll");
foreach (var file in files)
{
try
{
var asm = Assembly.LoadFrom(file);
var types = asm.GetTypes();
foreach (var type in types)
{
try
{
IPlayer player = (IPlayer)Activator.CreateInstance(type);
players.Add(player);
}
catch { }
}
}
catch { }
}
}
}
然后我在应用程序启动时加载所有播放器:
PlayersHost.LoadPlayers();
并使用生成的集合,例如:
var player = PlayersHost.Players[0];
try { player.PrepareToPlay(); } catch { }
需要一个解决方案使用AppDomain
为了隔离部分受信任的代码,.NET 提供了一种限制 AppDomain 内访问的机制——这称为 Sandbox(在沙箱中运行)。
有关如何使用它的信息,以及许多其他注意事项和细微差别,请参阅这篇 MSDN 文章: https://msdn.microsoft.com/en-us/library/bb763046(v=vs.110)。 ASPX
另一种更高级别的解决方案可能是使用
System.AddIn. 它是一个比 using 更复杂的框架AppDomain,但它提供了更多选项。特别是,它允许您自动查找下载的加载项,并根据需要下载它们。AppDomainAppDomain于您不信任的组件AppDomainAppDomain公共外部流程中。同时,交互协议保持不变。同时,跨越主代码和加载项之间边界的对象必须是可序列化的。
不幸的是,一个完整的例子不符合答案的格式,但文档中有一个很好的例子: