是否可以在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'或其中一个依赖项。系统找不到指定的文件。
执行函数时出现异常:遗留 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类?
答案 0 :(得分:0)
在进程中加载COM对象没有什么特别之处。该过程已经加载了大量随机窗口COM对象。试一试,看看它是否有效。
(发表评论的声誉不够)
答案 1 :(得分:0)
似乎无法在功能应用平台上运行regsvr32,在Kudu控制台上运行命令时,它会显示" Access Denied"。
解决方案是:
1-创建使用COM lib并使用其功能的小型Web服务,并在Windows VM上托管此应用程序。
2-在功能应用中托管您的代码的其他部分,而不是将功能APP引用到COM,您可以调用托管的Web服务(并传递您想要的任何参数)
或者只是您可以在VM上部署完整代码,而不使用功能APP。
(感谢Microsoft对此答案的支持)。