在不知道类型的情况下将程序集从文件加载到自定义 AppDomain
Posted
技术标签:
【中文标题】在不知道类型的情况下将程序集从文件加载到自定义 AppDomain【英文标题】:Load assemblies from file to custom AppDomain without knowing type 【发布时间】:2015-07-13 18:31:39 【问题描述】:我需要在单独的AppDomain
中加载几个.dll 文件,对它们进行一些操作并卸载AppDomain。我可以通过CreateInstanseFrom
做到这一点,但我需要知道类型的名称。
如果我得到给定程序集中的所有类型,我可以过滤掉我的。
我可以通过reflection获取所有类型,但这仅适用于当前的AppDomain,对吗?在当前域中先加载文件是没有用的,获取类型并将它们加载到自定义域中。
是否有将程序集从文件加载到自定义应用程序域的方法?
【问题讨论】:
我已经放弃了我的答案,因为我现在没有时间帮助你找到最好的方法......对不起。 【参考方案1】:不要尝试在 CreateInstanceFrom/CreateInstanceFromAndUnwrap 调用中使用来自某个目标程序集的类,而是使用您自己的类。您可以在 appdomain 中创建该众所周知的类并调用众所周知的方法。在那个众所周知的方法中,处理程序集。
// This class will be created inside your temporary appdomain.
class MyClass : MarshalByRefObject
// This call will be executed inside your temporary appdomain.
void ProcessAssemblies(string[] assemblyPaths)
// the assemblies are processed here
foreach (var assemblyPath in assemblyPaths)
var asm = Assembly.LoadFrom(assemblyPath);
...
并像这样使用它来处理程序集:
string[] assembliesToProcess = ...;
// create the temporary appdomain
var appDomain = AppDomain.CreateDomain(...);
try
// create a MyClass instance within the temporary appdomain
var o = (MyClass) appDomain.CreateInstanceFromAndUnwrap(
typeof(MyClass).Assembly.Location,
typeof(MyClass).FullName);
// call into the temporary appdomain to process the assemblies
o.ProcessAssemblies(assembliesToProcess);
finally
// unload the temporary appdomain
AppDomain.Unload(appDomain);
【讨论】:
加载我的程序集时,我得到一个无法加载文件或程序集“...”或其依赖项之一。该系统找不到指定的文件。我们谈论的是我添加的 shell32 和 wmplib 之类的 dll,但它们不是 .net 程序集。由于我的程序集依赖于它们,有没有办法可以加载“不安全”的程序集? UnsafeLoadFrom 不起作用。 .dll 不一定是程序集,程序集也不一定是 .dll。您正在尝试使用托管进程中的非托管 .dll。在我提供帮助之前,你必须告诉我们更多关于你想要完成的事情。但是,LoadLibrary 是用于加载 .dll 的 Win32 API。阅读文档可能会有所帮助。以上是关于在不知道类型的情况下将程序集从文件加载到自定义 AppDomain的主要内容,如果未能解决你的问题,请参考以下文章
如何在不先定义表中的列的情况下将数据加载到 PostgreSQL 中?
如何在不创建架构的情况下将 CSV 文件加载到 BigQuery
有没有办法在不将完整文件加载到内存的情况下将 tiff 图像转换为 Base64
如何在不先加载到 RAM 的情况下将文件加载到 blob 中?