C# 限制动态加载程序集的执行

C# 限制动态加载程序集的执行,c#,reflection,C#,Reflection,我正在构建一个棋盘游戏,可以添加自定义用户机器人。 机器人行为和决策根据接口定义: public interface IBotPlayer { ..... void Init(); PlayResult Play(TableState tableState) ; ..... } 其他用户可以在我在主应用程序中动态加载的外部程序集中实现该接口 Assembly assembly = Assembly.LoadFile("externalLib.dll

我正在构建一个棋盘游戏,可以添加自定义用户机器人。 机器人行为和决策根据接口定义:

public interface IBotPlayer 
{
    .....

    void Init(); 

    PlayResult Play(TableState tableState) ; 

    ..... 
}
其他用户可以在我在主应用程序中动态加载的外部程序集中实现该接口

Assembly assembly = Assembly.LoadFile("externalLib.dll");

foreach (var botPlayerType in assembly.GetTypes().Where(t => t.IsClass && t.IsAssignableFrom(typeof(IBotPlayer)))
{
    ..........

    // Execution on a new thread th
    // Now I wanna run it in some kind of sandbox with very limited right, no disk access, no network, ...

     IBotPlayer botPlayer = Activator.CreateInstance<IBotPlayer>(botPlayerType); 
     botPlayer.Init() ;     

     ........
}
Assembly=Assembly.LoadFile(“externalLib.dll”);
foreach(assembly.GetTypes()中的var botPlayerType,其中(t=>t.IsClass&&t.IsAssignableFrom(typeof(IBotPlayer)))
{
..........
//在新线程上执行
//现在我想在某种沙箱中运行它,权限非常有限,没有磁盘访问,没有网络。。。
IBotPlayer-botPlayer=Activator.CreateInstance(botPlayerType);
botPlayer.Init();
........
}
  • 如果IBotPlayer的
    IBotPlayer
    实现应该是算法的,那么是否可以仅使用集合来限制执行线程,例如?**如果是,如何

    • 这个答案正是您所需要的


      我自己玩过代码,可以说,上面答案的棘手部分是从受限appdomain执行sandboxer。然后,sandboxer加载一个包含不可信代码的dll并执行。

      您可以在您创建的受限appdomain中创建
      botPlayer
      实例,就像中一样。您还可以对其中的哪个实例感兴趣o基本相同,但方式更复杂。