还有,你可以用它来从未有OS按住锁一个整洁的小把戏.dll
的/ .exe
是个.exe
需要运行.
假设我们的目录如下所示:
>opener.exe >actualProgram.exe >dependency.dll
作为一个基本的例子,我们可以这样做:
namespace Opener
{
class Program
{
static void Main(string[] args)
{
AppDomain domain = AppDomain.CurrentDomain;
AppDomain newDomain = AppDomain.CreateDomain(
domain.FriendlyName,
domain.Evidence,
domain.BaseDirectory,
domain.RelativeSearchPath,
true, // "shadow copy" files: copy rather than lock
domain.SetupInformation.AppDomainInitializer,
domain.SetupInformation.AppDomainInitializerArguments
);
string assembly =
System.Reflection.Assembly.GetExecutingAssembly().Location
+ "\\..\\actualProgram.exe";
newDomain.ExecuteAssembly(assembly, args);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我们还可以在那里放置更多逻辑,actualProgram.exe
尽管正在打开一个进程实例,我们可以使用它来实际替换/更新.试一试:当你通过"开启者"加载它时,你将能够删除/修改/替换依赖项和"实际"程序.显然这有其好处,即更新更容易.
但是在你的"actual.exe"中,你怎么能确定它是通过另一个可执行文件加载的,并且知道它是在没有锁定的情况下加载的.exe
?如果有人要加载"actual.exe",即不通过"开启者",我想确保该过程立即退出.
提示?
actualProgram.exe
让它知道它是由启动器启动的。(也在 oleksii 对 OP 的评论中建议)AssemblyResolve
事件,将文件从磁盘加载到字节数组中并使用Assembly.Load(byte[], byte[])
重载。注意:只要在修改/移动/删除所有程序集之前手动或由运行时加载它们,就可能没问题。此外,加载 DLL 后对其进行更改可能不会对正在运行的进程产生影响。我说可能在这两种情况下,因为在运行时保留库通常是一个好主意,特别是如果您不手动加载它们。
也可以看看:
归档时间: |
|
查看次数: |
134 次 |
最近记录: |