4

我创建了一个使用给定域名(我工作的公司)签名的 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)解决了这个问题。

4

2 回答 2

1

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

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

I moved ComVisible and my Guid call to be a decorator on the class I want to expose to COM, and now the DLL always instantiates correctly and works without error.

I also now register using:

RegAsm.exe d:\foo\bar.dll /codebase /tlb
于 2016-04-21T15:18:51.327 回答
0

如果您正在使用 XLSX 文件并获得此行为,我相当有信心您正在使用 Office.Interop 类来执行此操作。IIS 内部不支持使用这些互操作 COM 类。如果您确实尝试从 IIS 内部使用它,您会得到与您描述的完全一样的行为。

您必须切换到其他库(例如Open XML SDK for Office)来创建 XLSX 文件。

一旦您进入 RDP,它就可以工作的原因是互操作 dll 需要桌面会话才能正常工作。当您被 RDPed 使用时,有一个会话可供它使用,一旦您断开连接,它就不再有一个会话。

于 2016-04-20T21:42:16.263 回答