C# 在新AppDomain中执行API函数的选项

C# 在新AppDomain中执行API函数的选项,c#,C#,我想调用在新AppDomain(asp.net MVC框架中的FWIW)中运行的API。我发现了一些在AppDomain中执行代码的选项。我对目前为止看到的冗长的解决方案不满意: 我发现: 程序集执行: appDomain.ExecuteAssembly("SOMEPATH.exe"); 启动可执行程序不是进行API调用的好方法。我认为需要将各种参数传递给Main(),这些参数表示API中的每个公共方法 反射: ObjectHandle handle = appDomain.CreateIns

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

我发现:

程序集执行

appDomain.ExecuteAssembly("SOMEPATH.exe");
启动可执行程序不是进行API调用的好方法。我认为需要将各种参数传递给
Main()
,这些参数表示API中的每个公共方法

反射:

ObjectHandle handle = appDomain.CreateInstance("someassembly.dll", "someType");
A a = (A) handle.Unwrap();
a.SomeField = "foo";
这给我的印象是,它是API的高级解决方案。然而,由于复杂的设置和潜在的性能开销,我不太喜欢反射

有没有一种方法可以在新线程中加载appdomain,这样我就可以在不经过这些限制的情况下启动方法?换言之,一些有效的方法:

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

或者诸如此类?

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

原始建议(在安全要求之前):

假设您不担心不跨应用程序域边界泄漏类型(这是AppDomains最常用的用法-通过将某些程序集约束到一个新的AppDomain,使它们“不可加载”)

您应该能够编写允许在其他域中创建强类型对象的帮助器方法-通常情况下,由于类型从新域“泄漏”到原始域(从而将其他程序集加载到原始域并防止卸载/更新程序集),因此不可能编写此类代码


注意:线程和AppDomains是不相关的概念-同一线程可以在一个堆栈上包含来自多个域的代码。没有内置的方法来限制线程“在单个应用程序域中运行”

你能解释一下你的高水平目标吗?我不建议处理AppDomains,除非您有非常可靠的论据。它们更难处理,也没有显著的好处。(唯一的一个是
AppDomain.Unload
)@Andrey-我之所以引入appdomains,是因为我需要严格限制安全性并分析在该上下文中启动的代码。@P.Brian.Mackey,您的实际需求仍然不清楚。。。但看看我的回答是否能更清楚地说明问题中缺少了什么……你能解释一下“你应该能够正常地为每一方编写代码”吗?我的问题的要点是“我希望我能像在新的appdomain中通常那样编写代码”。如果我理解正确,你是在说我可以。您能否给出一个代码示例,说明我如何切换appdomains,然后编写在新appdomain中运行的代码“与我通常所做的一样”?@P.Brian.Mackey,唯一需要编写特殊代码的地方是当您第一次跨越AppDomain边界时——如果您将所有感兴趣的代码移动到单个AppDomain中运行,那么大多数代码看起来都很正常。例如,让一个类有一个方法“运行所有代码并返回true/false”,然后实例化该类并跨应用程序域运行该方法(我最终会尝试添加示例)。哦,我明白了。复杂性在于,每次进行API调用时,我都要跨越appdomains。换句话说,API实际上是appdomains之间的边界。那么,我将按照您最初的建议添加一个helper方法,以隐藏在appdomains之间来回运行的丑陋实现细节。@P.Brian.Mackey,好的。只是重申一下-确保您了解当您将结果返回到原始域时会发生什么-如果您不小心,您可能会“泄漏”对象/类型,这可能是一个问题,如果您试图限制该程序集可以做什么,因为某些程序集在原始域中运行代码。