1

我想调用在新 AppDomain 中运行的 API(asp.net MVC 框架中的 FWIW)。我发现了一些在 AppDomain 中执行代码的选项。到目前为止,我对所看到的解决方案的冗长不满意:

我发现:

组装执行

appDomain.ExecuteAssembly("SOMEPATH.exe");

触发可执行文件并不是进行 API 调用的好方法。我想需要传递各种参数来Main()代表 API 中的每个公共方法。

反射:

ObjectHandle handle = appDomain.CreateInstance("someassembly.dll", "someType");
A a = (A) handle.Unwrap();
a.SomeField = "foo";

这让我觉得 API 是一个优秀的解决方案。但是,由于复杂的设置和潜在的性能开销,我不是 Reflection 的忠实粉丝。

有没有办法在新线程中加载应用程序域,这样我就可以在不经过这些箍的情况下触发方法?换句话说,一些有效的手段:

Thread.Start("useThisAppdomain", 
  //do work.
  className.M();//run in new appdomain
);

或之类的?

4

1 回答 1

2

如果您担心对在其他域中执行的代码添加安全限制,这很可能意味着您也不能让任何该代码在原始域中运行(它不会受到限制) - 所以您很可能通常“不要泄漏类型跨越 AppDomain 边界”要求。将在一个 AppDomain 中运行的代码与另一个明确分开将最大限度地减少在其他域中创建对象的需要。在很多情况下,单个“代码运行器”类可能足以安排其他领域的工作并返回结果。您应该能够正常为每一侧编写代码(假设您不需要加载未知程序集)。

Original suggestion (before security requirement):

Assuming you are not concerned about not leaking types across App domain boundary (which is most common use of AppDomains - make some assemblies "unloadable" by constraining them to one new AppDomain).

You should be able to write helper methods that allow strongly typed creation of objects in other domain - normally such code is not possible due to "leaking" types from new domain down to original domain (and thus loading other assemblies into original domain and preventing unload/updates to assembly).

Note: thread and AppDomains are unrelated concepts - same thread can have code from multiple domains on one stack. There is no built in way to restrict a thread to "run in single app domain".

于 2013-03-29T16:30:52.017 回答