C# ComVisible DLL 仅在连接远程桌面时可供 IIS 使用
C# ComVisible DLL only usable by IIS when Remote Desktop connected
我创建了一个用给定域名(我工作的公司)签名的 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)可以解决问题.
如果您正在使用 XLSX 文件并出现此行为,我相信您正在使用 Office.Interop 类 来执行此操作。使用那些互操作 COM 类 are not supported from inside IIS。如果您尝试从 IIS 内部使用它,您会得到与您描述的完全相同的行为。
您必须切换到 Open XML SDK for Office 等不同的库来创建 XLSX 文件。
一旦你进入 RDP 它就可以工作的原因是互操作 dll 需要一个桌面会话才能正常工作。当你在 RDP 中时,有一个会话供它使用,一旦你断开连接,它就不再有一个会话。
最后我从AssemblyInfo.cs中删除了以下代码:
[assembly: ComVisible(true)]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false,
AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]
我将 ComVisible 和我的 Guid 调用移动到 class 我想公开给 COM 的装饰器,现在 DLL 总是正确实例化并且工作没有错误。
我现在也使用以下方式注册:
RegAsm.exe d:\foo\bar.dll /codebase /tlb
我创建了一个用给定域名(我工作的公司)签名的 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)可以解决问题.
如果您正在使用 XLSX 文件并出现此行为,我相信您正在使用 Office.Interop 类 来执行此操作。使用那些互操作 COM 类 are not supported from inside IIS。如果您尝试从 IIS 内部使用它,您会得到与您描述的完全相同的行为。
您必须切换到 Open XML SDK for Office 等不同的库来创建 XLSX 文件。
一旦你进入 RDP 它就可以工作的原因是互操作 dll 需要一个桌面会话才能正常工作。当你在 RDP 中时,有一个会话供它使用,一旦你断开连接,它就不再有一个会话。
最后我从AssemblyInfo.cs中删除了以下代码:
[assembly: ComVisible(true)]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false,
AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]
我将 ComVisible 和我的 Guid 调用移动到 class 我想公开给 COM 的装饰器,现在 DLL 总是正确实例化并且工作没有错误。
我现在也使用以下方式注册:
RegAsm.exe d:\foo\bar.dll /codebase /tlb