结合使用In-Proc COM DLL和Azure函数

Mis*_*ook 5 azure azure-functions

是否可以在Azure函数中使用In-Proc COM DLL?

我正在将Web服务迁移到Azure Functions。组件之一依赖于旧版32位COM DLL。这通常需要将DLL在将要使用的系统上进行regsvr32编辑。似乎对于Azure Functions而言是不可能的,是否可以使用此类旧版实现?

还是有必要恢复到传统的云服务来支持这一点?(我更喜欢使用“消费”服务计划,并从“无服务器”架构中受益。)

脚步:

  1. 创建新的Azure Function应用
  2. 添加新的Azure函数(http触发器)
  3. 添加对32位COM组件的引用
  4. 在COM组件上调用简单的测试方法
  5. 在本地运行-运行正常
  6. 发布Azure功能
  7. 打开功能的HTTP路径-Azure功能失败

错误日志报告异常:

无法加载文件或程序集“ Interop.MyCOMLib,版本= 1.0.0.0,区域性=中性,公共密钥令牌=空”或其依赖项之一。该系统找不到指定的文件。

执行函数时的异常:Legacy Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时的异常:Legacy ---> System.IO.FileNotFoundException:无法加载文件或程序集'Interop.MyCOMLib,Version = 1.0.0.0,区域性= neutral,PublicKeyToken = null”或其依赖项之一。该系统找不到指定的文件。在System.Runtime.CompilerServices.AsyncTaskMethodBuilder的async Functions.Legacy.Run(HttpRequestMessage req,TraceWriter日志)处,在lambda_method(Closure,旧版,对象[]
在异步Microsoft.Azure.WebJobs.Host.Executors.TaskMethodInvoker 2.InvokeAsync(TReflected实例,Object []参数)在Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker 2.InvokeAsync [TReflected,TReturnValue](对象实例,对象异步Microsoft.Azure.Job上Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.InvokeAsync(IFunctionInvoker调用者,ParameterHelper parameterHelper,CancellationTokenSource timeoutTokenSource,CancellationTokenSource functionCancellationTokenSource,布尔throwOnTimeout,TimeSpan timerInterval,IFunctionInstances实例)在异步Web主机上。 .Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstance实例,ParameterHelper parameterHelper,TraceWriter traceWriter,CancellationTokenSource函数CancellationTokenSource)
在异步上Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)在异步上Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)

另外,如果我转到解决方案的Dependencies | COM然后选择Interop.Lib并选择“嵌入Interop类型”,然后在发布后通过调用已发布的函数进行此更改:

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

因此,挑战在于如何向Azure Functions注册COM类?

Mis*_*ook 1

似乎无法在功能应用程序平台上运行regsvr32,在Kudu控制台上运行命令时,它显示“访问被拒绝”。

\n\n

解决办法是:

\n\n

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

\n\n

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

\n\n

或者您可以在虚拟机上部署完整代码,并且不使用 Function APP。

\n\n

(感谢微软对这个答案的支持)。

\n