繁体   English   中英

免注册 COM 在本地机器上工作,但在 Azure 应用服务中抛出异常

[英]Registration-free COM works on a local machine, but throws exception in Azure App Service

尝试在 Azure 应用服务中使用 COM 库。 该库是 32 位的,并且该服务也配置为以 32 位运行。

为了让它在没有注册的情况下在本地机器上运行,我创建了一个清单文件,并从https://www.manifestmaker.com/sxs/help/iis_aspnet.htm的示例中复制了自定义激活码。 这样,dll 在本地机器上成功加载并激活,无需 COM 注册。

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
  <assemblyIdentity name="pp_cli_com_lib" version="1.0.0.0" type="win32" />
  <file name="pp_cli_com.dll" asmv2:size="460800">
    <hash xmlns="urn:schemas-microsoft-com:asm.v2">
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <dsig:DigestValue>JQXRI2IOR9A7KAn4+yW8n9pGMz0=</dsig:DigestValue>
    </hash>
    <typelib tlbid="{85796a56-cee8-426a-81e2-c896d7b3dbbd}" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
    <comClass clsid="{6d7c883b-9cca-4fc1-badb-fdc367b44ae7}" threadingModel="Apartment" tlbid="{85796a56-cee8-426a-81e2-c896d7b3dbbd}" progid="Pp_cli_com.KCP.1" description="KCP Class" />
  </file>
</assembly>
            var wmh = new WebManifestHelper();
            var activated = wmh.ActivateWebManifest("pp_cli_com_lib.manifest");
            if (!activated)
            {
                throw new InvalidOperationException($"Unable to activate! Error code: {wmh.dwError}.");
            }
            var kcpObject = new PP_CLI_COMLib.KCP();

但是,当尝试在 Azure App Service 中执行相同操作时,出现以下错误:

[FileLoadException:检索 COM class 工厂的 CLSID {6D7C883B-9CCA-4FC1-BADB-FDC367B44AE7} 组件因以下错误而失败:8007045a 动态链接库(DLL)初始化例程失败。 (Exception from HRESULT: 0x8007045A).] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +122 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +239 System.Activator.CreateInstance(Type type, Boolean nonPublic) +85 System.Activator.CreateInstance(Type type) +12

这是否意味着这个特定的 COM 库与 Azure App Service 沙箱环境不兼容?

创建 azure 应用服务器时, Publish的默认选项是使用沙盒环境的代码。

所以默认创建的webapp不支持免注册Com。

在此处输入图像描述

但是Azure App Service支持 Windows Containers ,您可以自定义容器。

为了在 Azure 应用服务中运行无注册的 COM,采取了以下步骤:

  1. 按照https://docs.microsoft.com/en-us/azure/app-service/quickstart-custom-container?pivots=container-windows中所述创建和发布自定义容器
  2. 将应用程序池切换为 32 位模式
  3. 添加 Visual C++ 可再分发到容器映像(此特定 COM 库需要)

结果 Dockerfile:

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2019
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'SilentlyContinue'; $ProgressPreference = 'SilentlyContinue';"]
ADD https://download.microsoft.com/download/C/6/D/C6D0FD4E-9E53-4897-9B91-836EBA2AACD3/vcredist_x86.exe /vcredist_x86.exe
RUN Start-Process -filepath C:\vcredist_x86.exe -ArgumentList "/install", "/passive", "/norestart", "'/log vcredist-setup.log'" -PassThru | wait-process
RUN "C:\\Windows\\System32\\inetsrv\\appcmd.exe set apppool /apppool.name:DefaultAppPool /enable32BitAppOnWin64:true"
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM