从.NET Framework 4.5.2升级到4.8后,带有COM初始化的Windows服务不再起作用

问题描述

我有一个将框架4.5.2升级到框架4.8的工作Windows服务。但是现在由于出现以下错误而导致该服务不再起作用:System.ApplicationException:CoIntializeSecurity失败,错误0x80010119

这是在4.5.2下可运行的代码,但在4.8下则不再可用

public Service()
{
    // Initialize COM security
    UInt32 hResult = COMNative.CoInitializeSecurity(
    IntPtr.Zero,// Add your security descriptor here
    -1,IntPtr.Zero,COMNative.RPC_C_AUTHN_LEVEL_PKT_PRIVACY,COMNative.RPC_C_IMP_LEVEL_IDENTIFY,COMNative.EOAC_disABLE_AAA | COMNative.EOAC_SECURE_REFS | 
    COMNative.EOAC_NO_CUSTOM_MARSHAL,IntPtr.Zero);

    if (hResult != 0)
        throw new ApplicationException(
            "CoIntializeSecurity Failed w/err 0x" + hResult.ToString("X"));
}

/// <summary>
/// Called when [start].
/// </summary>
/// <param name="args">The arguments.</param>
public void OnStart(string serviceName)
{
    ILogger logger = LoggerService.GetLogger();
    logger.Info("*** START OF SERVICE ***");
    logger.Info(serviceName + " (Version " + Assembly.GetExecutingAssembly().GetName().Version.ToString() + ") starting ....");

    Guid clsidsqlEventObj = new Guid(ComponentClassId);

    // Register the sqlEvent class object on start
    UInt32 hResult = COMNative.CoRegisterClassObject(
                    ref clsidsqlEventObj,new sqlEventClassFactory(),COMNative.CLSCTX_LOCAL_SERVER,COMNative.REGCLS_MULTIPLEUSE,out _cookiesqlEventObj);

   if (hResult != 0)
       throw new ApplicationException(
                "CoRegisterClassObject Failed w/err 0x" + hResult.ToString("X"));
    
}

我们已经尝试了多种安全设置,但没有任何运气。

有人知道4.5.2和4.8有什么区别吗?在这种情况下,为什么它不再起作用了?

解决方法

我终于设法解决了这个问题。 我将CoInitialize从服务类构造函数移至Main方法,并将其设置为启动时要做的第一件事,从而解决了该问题。

使用4.5.2和4.8时,服务构造函数的初始化似乎存在时间差异。我进行了很多搜索,但找不到这两个版本之间的确切变化。

如果有人对此有所了解,我仍然有兴趣将其广为人知;-)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...