0

我正在尝试在我的 .net 应用程序中使用第三方 com 对象。

通过这个 com 对象,我试图连接到 mssql 数据库。

com 对象仅在 MTA 线程中起作用。注册表中对象的“ThreadingModel”值为“Apartment”。

当我尝试在控制台应用程序中使用对象时 - 连接成功。当我将项目类型更改为 Windows 应用程序时 - 连接失败(com 对象方法返回消息“-2147023550:发生 OLE DB 错误。代码 80070542h”)。当我将 STAThread 属性添加到控制台应用程序的 Main 方法时 - 连接失败。

我试图用 MTA 单元从另一个线程调用我的 com 对象,但连接也失败了。

我正在尝试通过以下代码创建我的 com 对象:

var result = ComSecurity.CoInitializeSecurity(
                IntPtr.Zero,
                -1,
                IntPtr.Zero,
                IntPtr.Zero,
                RpcAuthnLevel.None,
                RpcImpLevel.Impersonate,
                IntPtr.Zero,
                EoAuthnCap.None,
                IntPtr.Zero);

var serverApplication = Activator.CreateInstance(Type.GetTypeFromProgID("LoodsmanServerApplication.MainSystem")) as IMainSystem;

...

public enum RpcAuthnLevel
    {
        Default = 0,
        None = 1,
        Connect = 2,
        Call = 3,
        Pkt = 4,
        PktIntegrity = 5,
        PktPrivacy = 6
    }

public enum RpcImpLevel
    {
        Default = 0,
        Anonymous = 1,
        Identify = 2,
        Impersonate = 3,
        Delegate = 4
    }

    public enum EoAuthnCap
    {
        None = 0x00,
        MutualAuth = 0x01,
        StaticCloaking = 0x20,
        DynamicCloaking = 0x40,
        AnyAuthority = 0x80,
        MakeFullSIC = 0x100,
        Default = 0x800,
        SecureRefs = 0x02,
        AccessControl = 0x04,
        AppID = 0x08,
        Dynamic = 0x10,
        RequireFullSIC = 0x200,
        AutoImpersonate = 0x400,
        NoCustomMarshal = 0x2000,
        DisableAAA = 0x1000
    }

[DllImport("ole32.dll")]
public static extern int CoInitializeSecurity(IntPtr pVoid, int
            cAuthSvc, IntPtr asAuthSvc, IntPtr pReserved1, RpcAuthnLevel level,
            RpcImpLevel impers, IntPtr pAuthList, EoAuthnCap dwCapabilities, IntPtr
            pReserved3);

有没有办法从 STA 线程使用 MTA COM 对象?

4

1 回答 1

0

您应该使用委托级别而不是模拟。MTA/STA 与它无关。

var result = ComSecurity.CoInitializeSecurity(
                IntPtr.Zero,
                -1,
                IntPtr.Zero,
                IntPtr.Zero,
                RpcAuthnLevel.None,
                RpcImpLevel.Delegate,
                IntPtr.Zero,
                EoAuthnCap.None,
                IntPtr.Zero);
于 2014-04-02T12:23:44.287 回答