Tôi đã tạo ra một thư viện kiểm trabóng sao chép để không khóa lắp ráp
public class Test
{
public int Add(int val1, int val2)
{
return val1 + val2;
}
}
Và một dự án để gọi nó là:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;
namespace Loader
{
class Program
{
static void Main(string[] args)
{
String path = @"...Lib.dll"; // path to lib
var name = Path.GetFileName(path);
AppDomainSetup setup = new AppDomainSetup
{
ApplicationBase = @"...", // directory where Lib.dll is
ShadowCopyFiles = "true",
ShadowCopyDirectories = @"..."// directory where Lib.dll is
};
var appdomain = AppDomain.CreateDomain("Loader." + name, null, setup);
Assembly ass = Assembly.LoadFile(path); // <--- I think here is the problem, here where assembly is locked
Assembly assembly = appdomain.Load(ass.FullName);
dynamic a = assembly.CreateInstance("Lib.Test");
Console.WriteLine(a.Add(1, 5));
}
}
}
Xin giúp tìm thấy những gì tôi đã làm sai? Tại sao lắp ráp của tôi bị khóa?
EDIT: với tên lắp ráp hardcoded:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;
namespace Loader
{
class Program
{
static void Main(string[] args)
{
AppDomainSetup ads = new AppDomainSetup();
String fullPath = @"c:\users\myuser\documents\visual studio 2010\Projects\ShadowCopy\Loader\bin\Debug\Lib.dll";
ads.ShadowCopyFiles = "true";
ads.ApplicationName = "AppName";
ads.ShadowCopyDirectories = Path.GetDirectoryName(fullPath);
//ads.ApplicationBase = Path.GetDirectoryName(fullPath);
//ads.PrivateBinPath = Path.GetDirectoryName(fullPath);
ads.CachePath = @"c:\users\myuser\documents\visual studio 2010\Projects\ShadowCopy\Loader\bin\Debug\Cache\";
AppDomain ad = AppDomain.CreateDomain("myName" + ads.ApplicationName, null, ads);
ad.AssemblyResolve += new ResolveEventHandler(ad_AssemblyResolve);
Console.WriteLine(ad.ShadowCopyFiles);
Console.WriteLine(ad.SetupInformation.ShadowCopyDirectories);
try
{
//Assembly assembly = ad.Load(AssemblyName.GetAssemblyName(fullPath));
//dynamic obj = ad.CreateInstanceAndUnwrap(assembly.GetName().Name, "Lib.Test");
dynamic obj = ad.CreateInstanceAndUnwrap("Lib", "Lib.Test");
Console.WriteLine(obj.Add(1, 7));
Console.ReadKey();
Console.WriteLine(obj.Add(1, 90));
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
static Assembly ad_AssemblyResolve(object sender, ResolveEventArgs args)
{
return Assembly.LoadFile(@"c:\users\myuser\documents\visual studio 2010\Projects\ShadowCopy\Loader\bin\Debug\Lib.dll");
}
}
}
Điều thú vị là cache assebly cũng bị khóa.
EDIT 2:
Đây là dòng mã để ngăn chặn việc lắp ráp
Console.WriteLine(obj.Add(1, 7));
Vì vậy, một khi một phương pháp trong Lib.Test được truy cập các assenbly bị chặn.
Giải pháp có thể là gì?
Vui lòng đăng lỗi chính xác mà bạn đang nhận được. –
Vấn đề chính xác như tôi đã nói là Lib.lắp ráp dll bị khóa. Ví dụ tôi không thể phát lại khi ứng dụng đang chạy. – NDeveloper
Bạn cần sử dụng giao diện trong phiên bản thứ 3 để ngăn mã của bạn tải loại được xây dựng vào tên miền ứng dụng chính. Không sử dụng LoadFile. –