he creado una biblioteca de pruebacopia sombra con el fin de no bloquear el montaje
public class Test
{
public int Add(int val1, int val2)
{
return val1 + val2;
}
}
y un proyecto para llamarlo:
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));
}
}
}
Por favor, ayuda para encontrar lo que he hecho mal? ¿Por qué mi ensamblaje está bloqueado?
EDIT: con el nombre codificado de montaje:
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");
}
}
}
Es interesante que almacena en caché assebly también está bloqueado.
EDIT 2:
Aquí está la línea de código para bloquear el conjunto de
Console.WriteLine(obj.Add(1, 7));
Así que una vez un método en el Lib.Test se accede a la assenbly está bloqueado.
¿Cuál puede ser la solución?
Por favor, publique el error exacto que está recibiendo. –
El problema exacto como he dicho es que Lib.dll el ensamblaje está bloqueado. Por ejemplo, no puedo replicarlo una vez que se ejecuta la aplicación. – NDeveloper
Debe usar una interfaz en un tercer ensamblaje para evitar que su código cargue el tipo construido en el dominio principal de la aplicación. No use LoadFile. –