小编Xia*_*ofu的帖子

COM互操作是否尊重.NET AppDomain边界以进行程序集加载?

这是核心问题:我有一个在单独的AppDomain中使用COM互操作的.NET应用程序.COM的东西似乎是将程序集加载回默认域,而不是从中调用COM内容的AppDomain.

我想知道的是:这是预期的行为,还是我做错了导致这些COM相关程序集被加载到错误的AppDomain中?请参阅以下情况的更详细说明......

该应用程序由3个程序集组成: - 主EXE,应用程序的入口点. - common.dll,只包含一个接口IController(采用IPlugin风格) - controller.dll,包含一个实现IController和MarshalByRefObject的Controller类.此类完成所有工作并使用COM interop与另一个应用程序进行交互.

主要EXE的相关部分如下所示:

AppDomain controller_domain = AppDomain.CreateDomain("Controller Domain");
IController c = (IController)controller_domain.CreateInstanceFromAndUnwrap("controller.dll", "MyNamespace.Controller");
result = c.Run();
AppDomain.Unload(controller_domain);
Run Code Online (Sandbox Code Playgroud)

common.dll只包含以下两件事:

public enum ControllerRunResult{FatalError, Finished, NonFatalError, NotRun}
public interface IController
{
    ControllerRunResult Run();
}
Run Code Online (Sandbox Code Playgroud)

controller.dll包含这个类(也调用COM互操作的东西):

public class Controller: IController, MarshalByRefObject
Run Code Online (Sandbox Code Playgroud)

首次运行应用程序时,Assembly.GetAssemblies()看起来像预期的那样,在两个AppDomain中都加载了common.dll,并且只将controller.dll加载到控制器域中.在调用c.Run()之后,我看到与COM互操作内容相关的程序集已加载到默认的AppDomain中,而不是在发生COM互操作的AppDomain中.

为什么会发生这种情况?

如果你有兴趣,这里有一些背景知识:

最初这是一个AppDomain应用程序.它与之接口的COM东西是一个服务器API,它在长时间使用时不稳定.当COM东西发生COMException(没有关于其原因的有用诊断信息)时,整个应用程序必须重新启动才能再次使用COM连接.只需重新连接到COM应用服务器,就会再次导致COM异常.为了解决这个问题,我试图将COM互操作内容移动到一个单独的AppDomain中,这样当神秘的COMExceptions出现时,我可以卸载发生它的AppDomain,创建一个新的并再次启动,所有这些都无需手动重启应用程序.无论如何,这就是理论......

c# com interop com-interop appdomain

8
推荐指数
1
解决办法
3397
查看次数

强制.NET互操作使用本地COM DLL

是否可以强制互操作程序集引用其关联的COM DLL的本地副本?

这是场景:

我有一个引用互操作程序集(Interop.OTAClient.dll)的.NET应用程序,它是COM DLL的互操作程序(OTAClient.dll,它是HP Quality Center的自动化API).我对COM不是很了解,但据我所知,interop程序集通过注册表中的GUID引用查找COM类,而不是指向特定文件.

我遇到的问题是,注册表项指向的OTAClient.dll副本会被不同版本覆盖,具体取决于我刚刚在浏览器中登录的QC版本,并且这些DLL的不同版本与之不兼容彼此..NET应用程序只会连接到特定版本的QC,因此我不能以这种方式改变COM DLL.

任何建议将不胜感激,因为这种行为真的很烦人.我已经看到了关于COM互操作问题的其他问题,但它们似乎都是强制使用本地版本的互操作DLL而不是GAC中的一个,而不是涉及实际COM DLL的这种特定情况.

.net dll com-interop hp-quality-center

7
推荐指数
2
解决办法
4364
查看次数

使用X509进行WCF安全本质上是否会因为每个请求有一个新频道而变慢?

我能做些什么来使X509表现更好遵循新通道 - 每个请求的最佳实践,或者这种缓慢的协商是使用X509进行WCF安全的固有缺点?

对于tl; dr跳到最后的Update 3以获取此源.

使用WCF频道的最佳做法似乎是"重用ChannelFactory,但为每个请求创建一个新频道",我总是这样做.例如,单个WCF信道性能与多个信道

我目前正在尝试使用X509证书作为安全凭证,而CreateChannel每次使用时间(15秒+).重新使用该通道会产生良好的性能(如果我理解正确,因为在调用CreateChannel时发生的初始公钥/私钥认证后使用了对称密钥),但这是不好的做法.

在服务器端:

var managerCertificate = new X509Certificate2(@"Manager.pfx", "");
var host = new ServiceHost(typeof(ManagerService));
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
host.Credentials.ClientCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
host.Credentials.ServiceCertificate.Certificate = managerCertificate;
host.Open();
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

在工人方面(减慢每个请求):

var workerCertificate = new X509Certificate2(@"Worker.pfx", "");
var cfact = new ChannelFactory<IManagerService>("client");
cfact.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
cfact.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
cfact.Credentials.ClientCertificate.Certificate = workerCertificate;
for (int i = 0; i < 10; i++)
{
    using (IManagerService channel = cfact.CreateChannel()
    {
         Console.WriteLine(channel.GetMyData("test data" + i));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在for循环之外移动CreateChannel调用以重用它,则只有第一个请求需要花费大量时间. …

.net c# wcf x509certificate

6
推荐指数
1
解决办法
1974
查看次数

围绕要求信用卡的技术问题BEFORE地址?

我正在考虑在实际产品的地址之前询问信用卡详细信息,平均购买价格在10美元到50美元之间

这样做的技术(或非技术)问题可能是什么?

我想到的是:

  • 从用户的角度来看,这似乎有点不标准
  • 如果我们发现我们遇到欺诈问题(目前还不是问题),我们无法解决验证问题
  • 用户可能更有可能完成销售,因为他们首先承诺了最重要的信息
  • 通过索要邮政编码,我们可以在询问地址时填写城市/州

我有什么破坏者或者我不考虑的事情吗?

我正在努力使系统尽可能灵活,但更愿意第一次得到正确而不会咆哮错误的树.

credit-card e-commerce

1
推荐指数
2
解决办法
236
查看次数