C#ComVisible DLL仅在远程桌面连接时可由IIS使用

时间:2016-04-20 19:39:58

标签: c# comvisible

我创建了一个ComVisible DLL,它使用给定的域名(我工作的公司)签名。我将此DLL放在客户的Web主机上,该主机在不同的域下运行,并使用以下命令注册:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ regsvcs

DLL在客户的Web主机本地磁盘上创建XLSX文件。用户可以使用浏览器下载此文件。

如果我向客户的Web主机打开远程桌面会话,则DLL会按预期运行,客户可以下载创建的临时文件。

但是,只要我放弃远程桌面会话(我没有注销并且我保持VPN连接),就不再可以访问DLL了。 asp经典站点不再创建临时文件,客户当然无法流式传输未创建的文件。

有什么可以导致这种情况的想法? Web服务器不会生成错误。

我认为DLL使用不同的域名进行签名,然后Web服务器主机是问题的一部分,但无法想象为什么打开远程桌面会话(我只是使用Microsoft的mstsc)来解决问题。 / p>

2 个答案:

答案 0 :(得分:1)

最后,我从AssemblyInfo.cs中删除了以下代码:

[assembly: ComVisible(true)]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false,
    AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]

我将ComVisible和我的Guid调用移动到我想要暴露给COM的类上的装饰器,现在DLL总是正确实例化并且无错误地工作。

我现在也注册使用:

RegAsm.exe d:\foo\bar.dll /codebase /tlb

答案 1 :(得分:0)

如果您正在使用XLSX文件并获得此行为,我相信您正在使用Office.Interop类来执行此操作。使用这些互操作COM类are not supported from inside IIS。如果您尝试从IIS内部使用它,您将获得与您描述的完全相同的行为。

您必须切换到Open XML SDK for Office之类的其他库来代替创建XLSX文件。

一旦你进入RDP,它的工作原理就是interop dll需要桌面会话才能正常运行。当你在RDPed中有一个会话供它使用时,一旦断开连接就不再有会话了。