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

问题描述 投票:4回答:2

是否可以使用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功能失败

错误日志报告异常:

无法加载文件或程序集'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类?

azure azure-functions
2个回答
0
投票

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

(发表评论的声誉不够)


0
投票

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

解决方案是:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.