我有一個問題,我真的不知道爲什麼它不起作用。我讀過很多教程(也在stackoverflow上),但仍然沒有任何內容。ShadowCopy程序集
我的目標是對某些.dll文件(它們尚未被任何程序使用)反射,並獲得繼承類型,方法,構造函數等。一切正常,但問題在於dll被鎖定並且無法刪除直到我關閉程序。這是我嘗試解決問題的代碼的一部分。
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))
//...
任何想法?
組件被加載到您當前的域中,因爲您正在'Load'調用中明確這樣做。如果您更仔細地閱讀教程,您會看到教程運行的代碼將程序集加載到新的域中...... –