Com 无法使用System.IO.Packaging确定域的标识
当通过COM互操作使用System.IO.Packaging时,我发现“无法确定域的标识”。有几篇文章描述了发生这种情况的原因,解决方案是在自己的AppDomain中运行有问题的函数 因此,我使用了示例代码,看起来像下面的代码,但我仍然得到了错误,我想知道我做错了什么,而且,在VS 2010中,它说AddAssembly和AddHost已经过时了-我想知道这是否意味着它们不再被实现,但如果是这种情况,我真的不知道如何使用新方法(补充证据和补充证据)Com 无法使用System.IO.Packaging确定域的标识,com,interop,appdomain,system.io.packaging,Com,Interop,Appdomain,System.io.packaging,当通过COM互操作使用System.IO.Packaging时,我发现“无法确定域的标识”。有几篇文章描述了发生这种情况的原因,解决方案是在自己的AppDomain中运行有问题的函数 因此,我使用了示例代码,看起来像下面的代码,但我仍然得到了错误,我想知道我做错了什么,而且,在VS 2010中,它说AddAssembly和AddHost已经过时了-我想知道这是否意味着它们不再被实现,但如果是这种情况,我真的不知道如何使用新方法(补充证据和补充证据) AppDomainSetup设置=新建AppD
AppDomainSetup设置=新建AppDomainSetup();
setup.ApplicationBase=AppDomain.CurrentDomain.BaseDirectory;
证据=新证据(AppDomain.CurrentDomain.证据);
证据.AddAssembly(Assembly.getExecutionGassembly().FullName);
证据.AddHost(新区域(SecurityZone.MyComputer));
AppDomain域=AppDomain.CreateDomain(“BlobPackage”,证据,设置);
BlobPackage blob_interal=(BlobPackage)domain.CreateInstanceAndUnwrap(typeof(BlobPackage).Assembly.FullName,typeof(BlobPackage).FullName);
blob_interal.pack(FilePath,RootPath,m_source_files);我自己解决了这个问题,忘了从MarshalByRefObject继承类
这有点愚蠢,它允许您创建一个实例并调用它,但它仍在默认域中运行,您可能会认为它会抛出异常或其他东西,无论如何,将该类标记为[Serializable()],并从MarshalByRefObject派生来修复它。您可以通过以下方式使用新方法:evidence.AddAssemblyEvidence(新的应用程序目录(Assembly.GetExecutionGassembly().FullName));
证据.AddHostEvidence(新区域(SecurityZone.MyComputer));
使用序列化属性标记类,并从MarshallByRefObject
派生类,在考虑跨appdomain调用时有点互斥。
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
Evidence evidence = new Evidence(AppDomain.CurrentDomain.Evidence);
evidence.AddAssembly(Assembly.GetExecutingAssembly().FullName);
evidence.AddHost(new Zone(SecurityZone.MyComputer));
AppDomain domain = AppDomain.CreateDomain("BlobPackage", evidence, setup);
BlobPackage blob_interal = (BlobPackage)domain.CreateInstanceAndUnwrap(typeof(BlobPackage).Assembly.FullName, typeof(BlobPackage).FullName);
blob_interal.pack(FilePath, RootPath, m_source_files); <-- STILL FAILS
AppDomain.Unload(domain);