- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个服务,在单独的应用程序域中托管和运行其他较小的服务(有点像迷你 IIS)。当每个服务在启动时注册时,我运行以下代码:
AppDomainSetup setup = new AppDomainSetup
{
LoaderOptimization = LoaderOptimization.MultiDomain,
ShadowCopyDirectories = service.FullPath, // Directory service binary lives in
ShadowCopyFiles = Convert.ToString(true)
};
AppDomain domain = AppDomain.CreateDomain(service.Name, null, setup);
ServiceDomain s = domain.CreateInstanceAndUnwrap<ServiceDomain>();
s.RegisterService(service, DefaultPort);
这基本上设置了一个应用程序域,启用卷影复制,并在新的应用程序域中调用 RegisterService
。 RegisterService
方法将创建一个对象的实例,它将影子复制程序集加载到内存中。
例如,服务可能在程序集 Foo.dll
中包含类型 ServiceFoo
。 Foo.dll
位于 service.FullPath
中,因此在加载应用程序域时会复制影子。从这一点开始,我可以删除或修改 service.FullPath
目录中的原始Foo.dll
,这太棒了。
但是,当有人修改原始Foo.dll
(例如,他们通过网络复制了一个新版本)时,我希望得到通知,以便我可以卸载旧的应用程序域并使用新版本的程序集重新创建它。
基本上,我在这里试图做的是让管理员能够部署新版本的服务,而不会中断在同一进程中运行的其他服务。
我的问题:当 Foo.dll
被修改时,或者 ShadowCopyDirectories
目录中的任何文件发生变化时,我如何得到通知?我确信我可以每隔几秒检查一次这些目录中的时间戳,但似乎应该有更好的方法。这种情况的最佳方法是什么?
更新:
我目前的想法都是围绕 FileWatcher
解决的。然而,弄清楚要观看的文件对我来说很困难。
想法 1: 监控 service.FullPath
,这是包含可能更改的文件的目录。但是,多个服务可能位于此目录中。如果我监控该目录,对一个文件的更改可能会导致实际上不使用该文件的服务错误地重新启动。
想法 2: 解析 service.TypeName
,这是一个包含完全限定类型名称的字符串。 .NET 提供了解析这些字符串的方法,例如 Type.GetType(string)
,这样我就可以访问代码库。但是,第二次我将程序集加载到父应用程序域中时,它就被锁定了,所以我不能再更改它了。我可以尝试手动解析 TypeName
,但这种语法相当复杂。有很多库试图解析这种语法。
想法 3: 监控 AssemblyLoad
事件:
domain.AssemblyLoad += (sender, args) =>
{
string test = AppDomain.CurrentDomain.FriendlyName;
Uri fileUri = new Uri(args.LoadedAssembly.CodeBase);
FileInfo fileInfo = new FileInfo(fileUri.LocalPath);
};
当域加载程序集时会被触发。我可以检测 fileInfo.Directory
是否与 service.FullPath
相同,如果是,则在该文件上设置监视。一个问题。此委托(delegate)在 domain
的上下文中运行。我无权访问 ServiceResolver
或根域中的任何内容。
想法 4: 在我调用 s.RegisterService
之后,检查 domain.GetAssemblies()
并尝试找到来自 >服务.FullPath
。但是,当我运行时:
var assemblies = domain.GetAssemblies();
它立即抛出异常:
Type 'System.Reflection.Emit.InternalAssemblyBuilder' in assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.
我不太清楚这是为什么。我猜 GetAssemblies()
只能在当前 AppDomain 上调用。
最佳答案
这就是我所做的。首先,我创建了一个名为 ServiceDomainProxy
的新类,如下所示:
internal class ServiceDomainProxy : MarshalByRefObject
{
private ServiceController controller;
private List<FileSystemWatcher> watchers;
public ServiceDomainProxy(ServiceController controller)
{
this.controller = controller;
}
public void CreateMonitor(Uri fileUri)
{
if(watchers == null)
watchers = new List<FileSystemWatcher>();
// Setup a FileWatcher on type, notify controller whenever it reloads
FileInfo file = new FileInfo(fileUri.LocalPath);
FileSystemWatcher watcher = new FileSystemWatcher
{
Path = file.DirectoryName,
Filter = file.Name
};
watcher.Changed += fileChanged;
watcher.EnableRaisingEvents = true;
watchers.Add(watcher);
}
void fileChanged(object sender, FileSystemEventArgs e)
{
Controller.Log.Info("Reloading Service Assembly: {0}", e.Name);
// TODO: Call the Reload method on controller
}
}
这个类基本上充当域之间的代理。接下来,我修改了我的 ServiceDomain
类,使其具有一个采用 ServiceDomainProxy
实例的构造函数:
public ServiceDomain(ServiceDomainProxy proxy)
{
this.proxy = proxy;
}
我必须更新我的 CreateInstanceAndUnwrap
调用以传入 ServiceDomainProxy
实例:
Type t = typeof(ServiceDomain);
ServiceDomain s = domain.CreateInstanceAndUnwrap(t.Assembly.FullName, t.FullName, false, BindingFlags.Default, null, new object[] { proxy }, null, null);
然后,在 ServiceDomain.RegisterService
中,我可以使用 ServiceDomainProxy
注册解析的类型:
proxy.CreateMonitor(new Uri(service.ResolveType().Assembly.CodeBase));
这会跨应用程序域边界调用 ServiceDomainProxy
的原始实例,然后它可以设置文件系统监视器并提醒 Controller 需要重新加载服务。
希望这对某人有帮助!
关于c# - 如何监视应用程序域中影子复制程序集的原始版本何时更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025046/
我正在编写一个应用程序,允许用户创建一个“问卷”,然后向其中添加问题。我正在使用核心数据来存储信息。我创建了一个问卷实体,并与问题实体建立了“一对多”关系。我的问题是,如果要允许用户复制(复制)整个调
有没有办法复制或复制 SharedPreference?或者我需要从一个变量中获取每个变量,然后将它们放入另一个变量中吗? 最佳答案 尝试这样的事情: //sp1 is the shared pref
下面的(A)和(B)有区别吗? (假设 NON ARC,如果重要的话) // --- (A) --- @interface Zoo : NSObject{} @property (copy) Dog
我正在尝试将 mysql SELECT 查询保存到文件中,如下所示: $result = mysqli_query($db,$sql); $out = fopen('tmp/csv.csv', 'w'
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
我在 Source 文件夹中有一个 Active wave 录音 wave-file.wav。我需要使用新名称 wave-file-copy.wav 将此文件复制到 Destination 文件夹。
在使用 GNU Autotools 构建的项目中,我有一个脚本需要通过 make 修改以包含安装路径。这是一个小例子: configure.ac: AC_INIT(foobar, 1.0) AC_PR
我想将 SQL 的行复制到同一个表中。但是在我的表中,我有一个“文本”列。 使用此 SQL: CREATE TEMPORARY TABLE produit2 ENGINE=MEMORY SELECT
谁能给我解释一下 df2 = df1 df2 = df1.copy() df3 = df1.copy(deep=False) 我已经尝试了所有选项并执行了以下操作: df1 = pd.DataFram
Hazelcast 是否具有类似于 Ehcache 的复制? http://www.ehcache.org/generated/2.9.0/pdf/Ehcache_Replication_Guide.
我有以下拓扑。一个 Ubuntu 16.04。运行我的全局 MySQL 服务器的 Amazon AWS 上的实例。我想将此服务器用作许多本地主服务器(Windows 机器 MySQL 服务器)的从服务
使用 SQLyog,我正在测试表中是否设置了正确的值。我尝试过 SELECT type_service FROM service WHERE email='test@gmail.com' 因此,只输出
有人可以提供一些关于如何配置 ElasticSearch 进行复制的说明。我在 Windows 中运行 ES,并且了解如果我在同一台服务器上多次运行 bat 文件,则会启动一个单独的 ES 实例,并且
一 点睛 ThreadGroup 复制线程的两个方法。 public int enumerate(Thread list[]) // 会将 ThreadGroup 中的 active 线程全部复制到
一 点睛 ThreadGroup 复制线程组的两个方法。 public int enumerate(ThreadGroup list[]) // 相对于 enumerate(list,true) pu
官方documentation Cassandra 说: Configure the keyspace and create the new datacenter: Use ALTER KEYSPAC
This question already has answers here: How to weight smoothing by arbitrary factor in ggplot2? (2个答
我们有一个表格来表明对各种俱乐部的兴趣。输出将数据记录在 Excel 电子表格中,其中列有他们的首选姓名、姓氏、电子邮件、代词,以及他们感兴趣的俱乐部的相应列中的“1”(下面的模型)。 我们希望为俱乐
This question already has answers here: Closed 8 years ago. Possible Duplicate: In vim, how do I get
如何复制形状及其所在的单元格?当我手动复制时,形状会跟随单元格,但是当我使用宏进行复制时,我会得到除形状之外的所有其他内容。 Cells(sourceRow, sourceColumn).Copy C
我是一名优秀的程序员,十分优秀!