我正在为C#应用程序开发一个“插件”系统。开发人员可以使用我们的API编写C#插件,然后用户可以将这些DLL添加到应用程序文件夹中,然后我们的应用程序将扫描/验证并加载(使用Assembly.LoadFrom
)
在我走得更远之前,我正在努力了解我需要注意的安全最佳实践。我可以找到很多关于生成安全DLL的信息,但我想尽最大努力加载 DLL。
有没有办法在一些隔离/锁定的上下文中加载每个DLL?那是什么应用程序域用于?
我认为这是准确的,但我是否正确阅读,我必须通过反射实质上与这些文件进行交互?
例如,这是Microsoft的technet的一个例子:
public class Loader : MarshalByRefObject
{
object CallInternal(string dll, string typename, string method, object[] parameters)
{
Assembly a = Assembly.LoadFile(dll);
object o = a.CreateInstance(typename);
Type t = o.GetType();
MethodInfo m = t.GetMethod(method);
return m.Invoke(o, parameters);
}
public static object Call(string dll, string typename, string method, params object[] parameters)
{
AppDomain dom = AppDomain.CreateDomain("MyNewDomain");
Loader ld = (Loader)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Loader).FullName);
object result = ld.CallInternal(dll, typename, method, parameters);
AppDomain.Unload(dom);
return result;
}
}
这比我想要的用户友好程度要低得多。我对应用程序方面并不介意,但如果开发人员编写相互集成的mod,他们必须使用相同的东西。
另外......我是否需要担心(如果可能的话)不允许访问某些系统?如果他们编写读取文件的代码,我是否可以阻止他们读取应用程序根目录之外的任何内容?