- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将程序集 (dll) 加载到 AppDomain 中并调用入口点。 (本质上是将包引导到 Azure 环境中)我一直在关注这篇 SO 文章 ( How do I create an application domain and run my application in it? ),我认为我做对了,但我遇到了一些问题。
我已经使用了这里的几篇文章来了解我目前的情况,但我一直遇到 FileNotFoundException
,如 Unable to load executing assembly into new AppDomain, FileNotFoundException 中所述。 .我的问题是解决方案不起作用。我尝试执行的程序集存在于不同的位置。所以 ApplicationBase
需要是我要执行的程序集的文件夹。
var otherType = typeof(BootstrapProxy);
var domaininfo = new AppDomainSetup
{
ConfigurationFile = executingAssembly + ".config",
ApplicationBase = _root
};
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
_domain = AppDomain.CreateDomain(_type.ToString(), adevidence, domaininfo);
_domain.AssemblyResolve += (sender, args) =>
{
var lookupPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (lookupPath == null) return null;
var assemblyname = new AssemblyName(args.Name).Name;
var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
var assembly = Assembly.LoadFrom(assemblyFileName);
return assembly;
};
var proxy = _domain.CreateInstanceAndUnwrap(otherType.Assembly.FullName, otherType.FullName) as BootstrapProxy;
最后一行抛出异常,并且 AssemblyResolve 事件永远不会触发(通过在 var lookupPath
行上放置一个断点来确定。
我也尝试过使用与上述相同的处理程序处理 AppDomain.CurrentDomain.AssemblyResolve
事件,但没有成功。我还尝试在 BootstrapProxy
类中创建相同的处理程序。
我认为我这样做是正确的,但请记下第一段,所以如果我完全偏离基地,我不反对以不同的方式做事。
更新:
我已经更改了代码以强制将程序集加载到新的应用程序域中,但仍然存在问题。
var otherType = typeof(BootstrapProxy);
var domaininfo = new AppDomainSetup
{
ConfigurationFile = executingAssembly + ".config",
ApplicationBase = _root
};
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
_domain = AppDomain.CreateDomain(_type.ToString(), adevidence, domaininfo);
var deps = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
foreach (var dep in deps)
{
var lookupPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (lookupPath == null) continue;
var assemblyname = new AssemblyName(dep.Name).Name;
var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
if (File.Exists(assemblyFileName))
_domain.Load(File.ReadAllBytes(assemblyFileName));
}
_domain.Load(File.ReadAllBytes(Assembly.GetExecutingAssembly().Location));
var sl = _domain.GetAssemblies().ToArray();
var proxy = _domain.CreateInstanceAndUnwrap(otherType.Assembly.FullName, otherType.FullName) as BootstrapProxy;
sl
显示所有 dll,包括在 FileNotFoundException
中引用的那个,都已加载到新的应用程序域中。
public class BootstrapProxy : MarshalByRefObject
{
public void Main()
{
Console.WriteLine("Magic happened.");
}
}
更新 2:
我把它改成这样:
var deps = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
foreach (var dep in deps)
{
var lookupPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (lookupPath == null) continue;
var assemblyname = new AssemblyName(dep.Name).Name;
var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
if (File.Exists(assemblyFileName))
File.Copy(assemblyFileName, Path.Combine(_root, assemblyname + ".dll"));
}
File.Copy(Assembly.GetExecutingAssembly().Location, Path.Combine(_root, Path.GetFileName(Assembly.GetExecutingAssembly().Location)));
var otherType = typeof(BootstrapProxy);
var domaininfo = new AppDomainSetup
{
ConfigurationFile = executingAssembly + ".config",
ApplicationBase = _root
};
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
_domain = AppDomain.CreateDomain(_type.ToString(), adevidence, domaininfo);
var proxy = _domain.CreateInstanceAndUnwrap(otherType.Assembly.FullName, otherType.FullName) as BootstrapProxy;
if (proxy != null)
{
proxy.Main();
}
这种将程序集及其引用复制到新 AppDomain 的 ApplicationBase 的方法并不理想,因为有一些公共(public)引用,我最终可能会遇到版本冲突和其他问题。
最佳答案
只是猜测,但问题就在这里:
var otherType = typeof(BootstrapProxy);
通过这样做,您将该程序集加载到调用应用程序域中。由于初始化,它会尝试加载调用域的查找路径中不存在的程序集。咔嚓!
解决这个问题:
通过其完全限定名称引用 otherType
并将程序集名称也作为字符串传递。 (我认为您可能只使用该类型的 FQN 就可以逃脱)
还有。您不应该为应用程序域之外的程序集真正处理 AssemblyResolve
。
关于c# - AppDomain 执行程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583648/
我为 ReSharper 编写了 xunit.net 测试运行程序,但在 8.0 版本中遇到了一个问题 - 我看到程序集无法加载到影子复制的 AppDomain 中。相同的代码和测试项目在 7.1 版
我无法弄清楚有关我的 AppDomain.Unload(...) 调用的问题。我有来自 my earlier question 的代码的详细解释.事实证明,我执行了几个显然不需要的步骤。但是,我相当确
我想在应用程序域内运行第三方库(在本例中为 XSP),这样我就可以关闭它或以其他方式控制它的行为。 基本流程: var child = AppDomain.CreateDomain(...) ...
我正在尝试将一个 dll 加载到控制台应用程序中,然后将其卸载并完全删除该文件。我遇到的问题是,在其自己的 AppDomain 中加载 dll 的行为会在父 AppDomain 中创建一个引用,因此除
我的印象是 AppDomains 彼此隔离。似乎在 StackOverException 的情况下,情况并非如此。 为了演示这个问题,我创建了一个简单的控制台应用程序,其唯一目的是生成一个新的 App
我有一个带有服务器“AppDomain”的应用程序,它接受来自单独的 AppDomain 的调用(其中托管插件,由其他人开发且不值得信赖)。 从服务器 AppDomain 中,我需要知道哪个“插件”(
坐: 我正在从我的进程中创建子应用程序域以加载程序集。 我可以调用此 AppDomain。 我想将一个对象从我的默认进程 AppDomain 传递到这个新创建的 AppDomain,以接收从加载到新
可能是以下副本:Can I prevent an uncaught exception in another AppDomain from shutting down the application?
我已经在 Specflow 2.0、nUnit 3.X、TeamCity 和 Visual Studio 2013 中编写了自动化测试。我试图并行运行这些测试,但它们失败了,因为代码使用静态类/对象。
我有一个 Bootstrapper,它查看 ASP.NET MVC 应用程序中的所有程序集以查找实现 IBootstrapperTask 接口(interface)的类型,然后将它们注册到 IOC C
我有一个 .NET 应用程序,它创建多个单独的 AppDomain 来运行一些可插入代码,每个 AppDomain 都设置自己的 WCF 命名管道服务来与中央应用程序进行通信。 但是我想为每个应用程序
对于我的项目,我需要从其他 .Net 程序集访问资源,但我不想让它们加载,因为我可能会加载同一程序集的不同版本。 为此,我创建了另一个 AppDomain,我使用 CreateInstanceAndU
我正在使用 AppDomain 来加载程序集然后卸载它们。 但是,我遇到了一个非常奇怪的问题。卸载 AppDomain 后 - 我仍然可以在进程资源管理器中看到某些程序集被多次加载! 为什么有加载的程
假设我有 AppDomainA,它启动 AppDomainB。 AppDomainB 然后启动 AppDomainC。 如果在 AppDomainA 中卸载 AppDomainB,AppDomainC
是否可以通过它的“友好名称”或 ID 来引用现有的 AppDomain(不是由我的代码创建)?还是以其他方式? 最佳答案 List AppDomains in Process 关于.net - 如何通
我在同一个虚拟目录下有一个网站和一个 web 服务,一些网页调用了 web 服务。 调用 Web 服务时,IIS 是创建新的 AppDomain 还是在同一个 AppDomain 中运行 Web 服务
在 ASP.NET 3.5(带有 IIS6)中,是否为每个请求创建了 AppDomains?我知道所有应用程序在 w3wp.exe 下都有自己的 AppDomain,但是整个 AppDomain 究竟
我一直无法找到关于使用 AppDomains 时发生的事情的非常清楚的描述,所以希望有人能够启发我。我有一个简单的测试程序(基本上是扯掉了 MSDN example ): using System;
我仍在尝试了解持续存在的问题,但它几乎可以概括为无法卸载 AppDomain。 它发生在将 ASP.NET WebAPI 部署到 Azure 应用服务期间,我们观察到以下情况: 进程 ID 不会更改,
我已经编写了在所有专用服务器上运行的软件(C#.NET控制台应用程序),这些服务器将管理各个Java进程(启动/停止/重新启动它们)。我遇到的问题是,当我的应用程序崩溃时,它不会关闭它启动的Java子
我是一名优秀的程序员,十分优秀!