我需要在一个进程中从两个版本的dll返回对象。我这样做彼此不兼容,我想在一个进程中连接到两种类型的MS WHQL服务器。 我正在尝试使用它:
namespace AppDomainTester
{
public class Program
{
[STAThread]
public static void Main(string[] args)
{
string pathToDll = Assembly.GetExecutingAssembly().Location;
string HCKpath = Path.Combine(Path.GetDirectoryName(pathToDll), @"WhqlDlls\HCK",
@"microsoft.windows.kits.hardware.objectmodel.dbconnection.dll");
string HLKpath = Path.Combine(Path.GetDirectoryName(pathToDll), @"WhqlDlls\HLK",
@"microsoft.windows.kits.hardware.objectmodel.dbconnection.dll");
try
{
object hck;
object hlk;
// HCK
AppDomainSetup domainSetupHck = new AppDomainSetup
{
PrivateBinPath = pathToDll
};
AppDomain domainHck = AppDomain.CreateDomain("HCK", null, domainSetupHck);
InstanceProxy proxyHck =
domainHck.CreateInstanceFromAndUnwrap(pathToDll, typeof (InstanceProxy).FullName) as InstanceProxy;
if (proxyHck != null)
{
object obj = new object();
hck = proxyHck.LoadLibrary(HCKpath, "tfs13-com-hck1");
}
//HLK
AppDomainSetup domainSetupHlk = new AppDomainSetup
{
PrivateBinPath = pathToDll
};
AppDomain domainHlk = AppDomain.CreateDomain("HLK", null, domainSetupHlk);
InstanceProxy proxyHlk =
domainHck.CreateInstanceFromAndUnwrap(pathToDll, typeof (InstanceProxy).FullName) as InstanceProxy;
if (proxyHlk != null)
{
object obj = new object();
hlk = proxyHlk.LoadLibrary(HCKpath, "tfs13-com-hck1");
}
//var some = domainHck.GetAssemblies();
AppDomain.Unload(domainHck);
AppDomain.Unload(domainHlk);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
}
}
}
internal class InstanceProxy : MarshalByRefObject
{
private object obj;
public object LoadLibrary(string path, string controller)
{
Assembly asm = Assembly.LoadFrom(path);
Type[] types = asm.GetExportedTypes();
Type type =
types.FirstOrDefault(
t =>
(t.FullName == "Microsoft.Windows.Kits.Hardware.ObjectModel.DBConnection.DatabaseProjectManager"));
if (type != null)
{
var constructor = type.GetConstructors().Single(x => x.GetParameters().Length == 1);
obj = constructor.Invoke(new[] {controller});
//
return obj;
//
}
return null;
}
}
}
我想从obj
方法返回LoadLibrary
,但如果我尝试return obj;
,我会收到异常:(
我做错了什么?
编辑1 :
类型 'Microsoft.Windows.Kits.Hardware.ObjectModel.DBConnection.DatabaseProjectManager' 在程序集'Microsoft.Windows.Kits.Hardware.ObjectModel.DBConnection中, Version = 1.4.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'是 没有标记为可序列化。