C# ComVisible DLL只有在远程桌面连接时才能被IIS使用

4
我创建了一个ComVisible DLL,它使用给定的域名(我所在公司的域名)进行签名。我将此DLL放置在客户的Web主机上,该主机运行在不同的域下,并使用以下命令进行注册:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regsvcs。
该DLL在客户的Web主机上创建了一个本地磁盘上的XLSX文件。用户可以使用浏览器下载此文件。
如果我在客户的Web主机上打开了远程桌面会话,则DLL会按预期工作,并且客户可以下载创建的临时文件。
然而,一旦我关闭远程桌面会话(我没有注销并且保持VPN连接),DLL就无法访问。ASP经典网站不再创建临时文件,当然客户也无法流式传输未创建的文件。
你有什么想法是什么原因导致这种情况?Web服务器没有生成任何错误。
我认为DLL使用的不同域名进行签名是问题的一部分,但不知道为什么打开远程桌面会话(我只是使用Microsoft的mstsc)可以解决这个问题。
2个回答

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

0
如果您正在使用XLSX文件并出现此行为,我相当有信心您正在使用Office.Interop类来执行此操作。使用这些Interop COM类不受IIS内部支持。如果您尝试从IIS内部使用它,则会得到与您所描述的完全相同的行为。
您必须切换到另一个库,如Open XML SDK for Office,以代替创建XLSX文件。
之所以在RDP连接后可以正常工作的原因是Interop dll需要桌面会话才能正确运行。当您RDP连接时,有一个会话可供其使用,一旦您断开连接,它就没有会话了。

我正在使用DocumentFormat.OpenXml。然而,在我的AssemblyInfo.cs文件中,我有以下内容:`[assembly: ComVisible(true)][assembly: ApplicationActivation(ActivationOption.Server)] [assembly: ApplicationAccessControl(false, AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]`我怀疑这两行代码中的一行或者两行是罪魁祸首?MSDN对它们的文档不够详细。我已经删除了这两行代码,并将ComVisible和Guid移到了一个类上,这个类是我想要公开的,现在它可以正常工作了。 - Developer Webs
我建议您将这些细节发布为自己问题的答案并接受它。 - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接