0

.net アプリケーションでサードパーティの com オブジェクトを使用しようとしています。

この com オブジェクトによって、mssql データベースに接続しようとしています。

com オブジェクトは MTA スレッドでのみ機能します。レジストリ内のオブジェクトの「ThreadingModel」値は「Apartment」です。

コンソール アプリケーションでオブジェクトを操作しようとすると、接続が成功します。プロジェクト タイプを Windows アプリケーションに変更すると、接続に失敗します (com オブジェクト メソッドがメッセージ「-2147023550:OLE DB エラーが発生しました。コード 80070542h」を返します)。コンソール アプリケーションの Main メソッドに STAThread 属性を追加すると、接続に失敗します。

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