C# 卷影复制程序集
我有一个问题,我真的不知道为什么它不工作。我读了很多教程(也有关于stackoverflow的),但仍然一无所获 我的目标是对一些.dll文件(它们还没有被任何程序使用)使用反射,并获得继承类型、方法、构造函数等。一切都正常工作,但问题是dll被锁定,在我关闭程序之前无法删除。这是我试图解决问题的代码的一部分C# 卷影复制程序集,c#,reflection,dll,C#,Reflection,Dll,我有一个问题,我真的不知道为什么它不工作。我读了很多教程(也有关于stackoverflow的),但仍然一无所获 我的目标是对一些.dll文件(它们还没有被任何程序使用)使用反射,并获得继承类型、方法、构造函数等。一切都正常工作,但问题是dll被锁定,在我关闭程序之前无法删除。这是我试图解决问题的代码的一部分 var apds = new AppDomainSetup(); apds.ApplicationName = "MyAssemblies"; Evidence adevidence =
var apds = new AppDomainSetup();
apds.ApplicationName = "MyAssemblies";
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain apd = AppDomain.CreateDomain("newdomain", adevidence, apds);
apd.AppendPrivatePath("Assemblies");
apd.SetCachePath("C:\\Cache");
apd.SetShadowCopyFiles();
foreach (var type in apd.Load(AssemblyName.GetAssemblyName(file.Path)).GetTypes())
{
foreach (var inherits in GetInheritanceHierarchy(type))
{ //rest is ok
我知道我使用了一些不推荐的方法,但这是一种尝试。DLL已成功复制到缓存目录中,但它们似乎也已加载到当前域中。
问题出在哪里?
提前谢谢
我将代码修改为并使用Loader类,但仍然锁定了文件
class Loader : MarshalByRefObject
{
public Assembly assembly;
public void LoadAssembly(string path)
{
assembly = Assembly.Load(AssemblyName.GetAssemblyName(path));
}
public Types[] getTypes()
{
return assembly.getTypes();
}
}
//...
if (file.Type == ".dll")
{
var apds = new AppDomainSetup
{
ApplicationName = "MyAssemblies",
ApplicationBase = Path,
ShadowCopyFiles = "true",
ShadowCopyDirectories = Path
};
AppDomain apd = AppDomain.CreateDomain("newdomain", null, apds);
Loader loader = (Loader)apd.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName);
loader.LoadAssembly(file.Path);
foreach (var type in loader.getTypes())
{
foreach (var inherits in GetInheritanceHierarchy(type))
//...
有什么想法吗?您可以按以下方式加载程序集
var types = Assembly.Load(File.ReadAllBytes("YourAssembly.dll")).GetTypes();
现在,您可以从程序集中提取类型,并且可以在应用程序仍在运行时删除程序集。程序集将加载到当前域中,因为您使用
Load
调用显式地执行此操作。如果您更仔细地阅读教程,您将看到教程运行的代码在新域中加载程序集……这有助于我动态加载库dll,并在需要时进行更改,而无需重新发布。会有内存问题吗