是否可以使用Azure函数的In-Proc COM DLL?
我正在将我的Web服务迁移到Azure Functions。其中一个组件依赖于传统的32位COM DLL。这通常需要在将要使用它的系统上对DLL进行regsvr32-ed。由于Azure功能似乎无法实现,因此可以使用此类传统实现吗?
或者是否有必要恢复到经典的云服务来支持这一点? (我的偏好是使用消费服务计划并从“无服务器”架构中受益。)
脚步:
错误日志报告异常:
无法加载文件或程序集'Interop.MyCOMLib,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。该系统找不到指定的文件。
执行函数时出现异常:Legacy Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时出现异常:Legacy ---> System.IO.FileNotFoundException:无法加载文件或程序集'Interop.MyCOMLib,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。该系统找不到指定的文件。在System.Runtime.CompilerServices.AsyncTaskMethodBuilder的异步Functions.Legacy.Run(HttpRequestMessage req,TraceWriter日志)1.在lambda_method的函数.Legacy.Run(HttpRequestMessage req,TraceWriter日志)启动[TStateMachine](TStateMachine&stateMachine)(闭包,遗产,对象[]) 在Microsoft.Azure.WebJobs.Host.Executors.TaskMethodInvoker 2.InvokeAsync(TReflected instance,Object [] arguments)at async Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker 2.InvokeAsync [TReflected,TReturnValue](Object instance,Object [] arguments)异步Microsoft.Azure.WebJobs.Host异步Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.InvokeAsync(IFunctionInvoker调用者,ParameterHelper parameterHelper,CancellationTokenSource timeoutTokenSource,CancellationTokenSource functionCancellationTokenSource,Boolean throwOnTimeout,TimeSpan timerInterval,IFunctionInstance实例) .Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstance实例,ParameterHelper parameterHelper,TraceWriter traceWriter,CancellationTokenSource functionCancellationTokenSource) at 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))。”
因此,面临的挑战是如何使用Azure Functions注册COM类?
在进程中加载COM对象没有什么特别之处。该过程已经加载了大量随机窗口COM对象。试一试,看看它是否有效。
(发表评论的声誉不够)
似乎无法在功能应用平台上运行regsvr32,当在Kudu控制台上运行命令时,它显示“拒绝访问”。
解决方案是:
1-创建使用COM lib并使用其功能的小型Web服务,并在Windows VM上托管此应用程序。
2-在功能应用程序中托管您的代码的其他部分,而不是将功能APP引用到COM,您可以调用托管的Web服务(并传递您想要的任何参数)
或者只是您可以在VM上部署完整代码,而不使用功能APP。
(感谢Microsoft对此答案的支持)。