使用带有Azure功能的In-Proc COM DLL

时间:2017-12-10 14:41:13

标签: azure azure-functions

是否可以在Azure功能中使用In-Proc COM DLL?

我正在将我的Web服务迁移到Azure Functions。其中一个组件依赖于传统的32位COM DLL。这通常需要在将要使用它的系统上对DLL进行regsvr32-ed。由于Azure功能似乎无法实现,因此可以使用此类传统实现吗?

或者是否有必要恢复到经典云服务来支持这一点? (我的偏好是使用消费服务计划,并从"无服务器"架构中受益。)

步骤:

  1. 创建新的Azure功能应用
  2. 添加新的Azure功能(http触发器)
  3. 添加对32位COM组件的引用
  4. 在COM组件上调用简单的测试方法
  5. 本地运行 - 工作正常
  6. 发布Azure功能
  7. 打开功能http路径 - Azure功能失败
  8. 错误日志报告异常:

    无法加载文件或程序集' Interop.MyCOMLib,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。系统找不到指定的文件。

      

    执行函数时出现异常:遗留   Microsoft.Azure.WebJobs.Host.FunctionInvocationException:Exception   执行功能时:遗产---> System.IO.FileNotFoundException   :无法加载文件或程序集' Interop.MyCOMLib,Version = 1.0.0.0,   Culture = neutral,PublicKeyToken = null'或其中一个依赖项。该   系统找不到指定的文件。在async   Functions.Legacy.Run(HttpRequestMessage req,TraceWriter log)at   System.Runtime.CompilerServices.AsyncTaskMethodBuilder 1.Start [TStateMachine](TStateMachine&   state.Legacy.Run(HttpRequestMessage)中的stateMachine   req,TraceWriter log)在lambda_method(Closure,Legacy,Object [])
      在   Microsoft.Azure.WebJobs.Host.Executors.TaskMethodInvoker 2.InvokeAsync(TReflected   异步时实例,Object [] arguments)   Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker 2.InvokeAsync [TReflected,TReturnValue](Object   异步时实例,Object [] arguments)   Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.InvokeAsync(IFunctionInvoker   invoker,ParameterHelper parameterHelper,CancellationTokenSource   timeoutTokenSource,CancellationTokenSource   functionCancellationTokenSource,Boolean throwOnTimeout,TimeSpan   异步时的timerInterval,IFunctionInstance实例)   Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstance   实例,ParameterHelper parameterHelper,TraceWriter   traceWriter,CancellationTokenSource functionCancellationTokenSource)
      在async   Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)   在async   Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)   内部异常结束

    另外,如果我转到解决方案的依赖关系| COM然后选择Interop.Lib并选择Embed Interop Types然后在发布之后通过此更改调用publushed函数:

    "由于以下错误,检索具有CLSID {D84F92D7-FFFF-4C16-B939-EC98E3A6EBC0}的组件的COM类工厂失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))。 #34;

    因此,挑战是如何使用Azure Functions注册COM类?

2 个答案:

答案 0 :(得分:0)

在进程中加载​​COM对象没有什么特别之处。该过程已经加载了大量随机窗口COM对象。试一试,看看它是否有效。

(发表评论的声誉不够)

答案 1 :(得分:0)

似乎无法在功能应用平台上运行regsvr32,在Kudu控制台上运行命令时,它会显示" Access Denied"。

解决方案是:

1-创建使用COM lib并使用其功能的小型Web服务,并在Windows VM上托管此应用程序。

2-在功能应用中托管您的代码的其他部分,而不是将功能APP引用到COM,您可以调用托管的Web服务(并传递您想要的任何参数)

或者只是您可以在VM上部署完整代码,而不使用功能APP。

(感谢Microsoft对此答案的支持)。