1
내 목표는 해당 어셈블리의 여러 버전에 대해 특정 어셈블리를 사용하는 코드 "조각" "을 실행하는 것입니다. 필자가 수행하는 방법은 각 어셈블리 버전마다 하나씩, 별도의 AppDomains에서 "코드 조각"을 실행하는 것입니다. 은 "코드의 조각"반영을 통해 어셈블리를 사용하지만, 제가하고 싶은 것은 "코드의 조각은"강력한 형식의 방법으로 기입 해 있다는 것입니다 때 여러 AppDomain에 여러 어셈블리 버전로드
나는이 만 할 수 있었다. 즉,이 전하여 다음 있다고 가정 해 봅시다 : 또한
namespace ClassLibrary1
{
public class Class1
{
internal const string Version = "1.0.0.0";
public string Method1() { return Version; }
}
}
그것을 가지고있는 AssemblyInfo.cs에 다음과 같은 정의 :
[assembly: AssemblyVersion(ClassLibrary1.Class1.Version)]
이제 의 난은 "버전"이 있다고 가정하자 예를 들어, 여러 버전의 해당 어셈블리가있는 폴더 :
/Versions/
├─ /1000/
│ └─ ClassLibrary1.dll
├─ /1001/
│ └─ ClassLibrary1.dll
└─ /1002/
└─ ClassLibrary1.dll
은 "코드의 조각을"실행 나는 다음과 같은 콘솔 응용 프로그램을 사용하고 있습니다 :
class Program
{
static void PieceOfCode(Assembly assembly)
{
Type class1Type = assembly.GetType("ClassLibrary1.Class1");
dynamic class1 = Activator.CreateInstance(class1Type);
string vesion = class1.Method1();
Console.WriteLine(vesion);
}
public sealed class SeparateDomainExecutor : MarshalByRefObject
{
public void Execute(Action<Assembly> action, string assemblyPath)
{
action(Assembly.LoadFrom(assemblyPath));
}
}
static void Main(string[] args)
{
foreach (string file in Directory.EnumerateFiles(@"C:\Versions", "*.dll", SearchOption.AllDirectories))
{
AppDomain domain = AppDomain.CreateDomain("ClassLibrary1 Domain");
var type = typeof(SeparateDomainExecutor);
var runner = (SeparateDomainExecutor)domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
runner.Execute(PieceOfCode, file);
AppDomain.Unload(domain);
}
Console.Read();
}
}
콘솔 응용 프로그램이 잘 작동하지만 내가 다음과 같은 뭔가 "PieceOfCode"에서 그 반사 사용을 대체 할 싶습니다
를static void PieceOfCode()
{
ClassLibrary1.Class1 class1 = new ClassLibrary1.Class1();
Console.WriteLine(class1.Method1());
}
이것이 가능합니까?
내가 가진 문제는 PieceOfCode가 특정 버전의 ClassLibrary1 (아마도 최신 버전)을 사용하여 작성되었으며 별도의 AppDomain에서 해당 버전을 "재정의"할 수 없다는 것입니다. 나는 몇 가지 시도를했지만 항상 FileLoadException으로 끝납니다.
강력한 명명 된 어셈블리이고 응용 프로그램을 잘로드하기 전에 버전을 알고 있다면 app/web .config 파일에서 바인딩 리디렉션 및 변경 버전을 사용할 수 있습니다. –
"강력하게 형식화 된"은 "여러 버전" . .NET은 형식 ID에 어셈블리의 버전 번호를 포함하여 강력한 형식 검사를 구현합니다. 강력한 DLL 지옥 카운터 - 측정,하지만 분명히 디자인으로 지옥을 만들고 싶어. 그래서 당신은 이것을 전혀하고 싶지 않습니다. –
예, 정확하게. 기본적으로 나는 강력한 이름 인 dll-hell 보호 기능을 무시하기를 원했습니다. – bellpatricia