C# 在C中运行时安全导入外部库#

C# 在C中运行时安全导入外部库#,c#,file,dll,reflection,.net-assembly,C#,File,Dll,Reflection,.net Assembly,我正在构建一个程序,我打算在其中提供一个API,允许其他开发人员构建.dll库,这些库放在一个文件夹中,我的程序可以在运行时找到并导入它们。我找到文件并使用Assembly.load()加载它们,然后使用Assembly.GetExportedTypes()查找类,它实现了一个特定的接口 这段代码运行正常,但坦率地说,我对开发人员可能导入的内容有些担心,特别是在从代码中运行可执行文件、试图访问或删除程序文件夹结构之外的系统上的文件等操作方面,甚至可能建立某种网络连接并转发数据 我明白,允许使用这

我正在构建一个程序,我打算在其中提供一个API,允许其他开发人员构建.dll库,这些库放在一个文件夹中,我的程序可以在运行时找到并导入它们。我找到文件并使用Assembly.load()加载它们,然后使用Assembly.GetExportedTypes()查找类,它实现了一个特定的接口

这段代码运行正常,但坦率地说,我对开发人员可能导入的内容有些担心,特别是在从代码中运行可执行文件、试图访问或删除程序文件夹结构之外的系统上的文件等操作方面,甚至可能建立某种网络连接并转发数据


我明白,允许使用这种功能时,我必须承担一定程度的风险,但是我可以做些什么来加强程序的恶意活动,同时仍然允许导入外部库以实现扩展性?

如果您在这些DLL文件中调用函数,您将无法控制。如果你告诉我们一个机器人你想要完成什么(其他开发者可以做什么),我们可能会建议一个不同的方法。也许你可以检查插件并对其进行签名。根据你的使用情况,你可以在不同的应用程序域中实现一个沙盒,例如:@thehenny。因此,从某种意义上说,沙盒的想法与其说是创建一个黑名单,说明代码不能做什么,不如说是一个白名单,描述代码可以访问什么?是的,白名单应该是更多一般来说,不需要太多特殊的代码。您只需要某种桥来在appdomains之间共享信息——正如您已经发现的,CreateInstanceAndUnwrap是创建一个应用程序域的方法。无法卸载程序集,除非关闭加载程序集的整个appdomain。也许你可以详细说明你的用例,然后重新开始这个问题。