C#:从Windows服务但未从控制台应用程序获取错误“无法创建Active X组件” - c#

我有一个用c#编写的Windows服务,该服务一直在监听Azure中的一个事件中心。收到消息后,服务将处理该消息并执行一些执行和计算。

作为执行的一部分,它将启动一个名为AutoCal(公司自己的窗口的应用程序)的应用程序,该应用程序是类似于EXCEL的COM组件。

早些时候,我有一个执行相同的计算/执行的Web API。根据每个请求,它将打开AutoCal并进行一些处理。我已经在项目中添加了AutoCal dll作为参考。

打开AutoCal的代码类似:

(AutoCal.Application)Interaction.CreateObject("AutoCal.Application.NewInstance").

当我在本地测试时,它完全符合预期。但是,一旦将其托管在服务器上,它就会抛出一个错误消息:“无法创建ActiveX组件”。为了解决这个问题,我已授予向IIS应用程序池打开COM组件的权限。这已经解决了我的问题。

现在,我有一个Windows服务,该服务也可以打开AutoCal,从哪里可以授予CO组件权限。我已经搜索过了,但是到处都只有ASP.net解决方案。

如何为Windows服务解决此问题。在这方面的任何帮助将非常有用。谢谢。

PS:当我在控制台应用程序中编写了相同的代码时,它工作正常。

参考方案

如果没有确切的错误日志(您可以尝试在EventViewer中查找相关的错误吗?),很难分辨出问题所在。

但我会尝试以下方法:

在开始菜单中,键入Component services并将其打开(右键单击-以管理员身份!)
转到Component services -> My Computer -> DCOM Config文件夹

您会看到类似这样的内容

C#:从Windows服务但未从控制台应用程序获取错误“无法创建Active X组件” - c#

在树中找到您的COM应用程序。
右键单击它,打开属性,转到Security Tab

它将看起来像这样(不用管图片中标签的标题,在您的情况下,它应该类似于AutoCal):

C#:从Windows服务但未从控制台应用程序获取错误“无法创建Active X组件” - c#

如果变灰(例如我的情况),则可以使用以下过程来更改系统上的设置,并使此选项卡可配置:

转到Start > Run。输入regedit
转到与要管理的DCOM组件关联的密钥:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
右键单击它。选择Permissions
点击Advanced
将所有者更改为Administrator或您的用户帐户
点击OK
Full Control组和您选择的所有者选择Administrators
转到Start > Run。搜索services
查找COM+ System Application。右键单击该服务,然后单击Restart

C#:从Windows服务但未从控制台应用程序获取错误“无法创建Active X组件” - c#

启用Security选项卡后,可以更改COM对象的权限。例如-您可以允许运行您的服务的用户访问或激活此COM对象。

希望这对您有所帮助,但同样,没有任何其他错误信息-这是一个漫长的尝试。

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript

当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…

如何使用箭头符号(->)创建受保护的方法? - java

当我们编写以下代码时Stream.of(1,2,3,4,5).filter(i -> (i%2 == 0)).map( i -> i*i ); 表达式i -> (i%2 == 0)或i -> i*i将变为私有方法。在我的用例中,编写了一个junit测试,以确保没有方法是私有的(是的,这是强制性的),并且对于这些lambda表达式而言,…

粗糙的Unicode->没有CLDR的语言代码? - javascript

我在写字典应用。如果用户键入Unicode字符,我想检查该字符是哪种语言。例如字 - returns ['zh', 'ja', 'ko'] العربية - returns ['ar'] a - returns ['en', 'fr', …