3

x64 C# アプリケーションで x86 dll を使用したい! フォーラムで、com オブジェクトが役立つことを読みました。これは私の ComServerSample です。x86のようにコンパイルされます。

    [ComVisible(true)]
    public class MyComServer : IMyComSample
    {        
        private dahuaIp.fDisConnect dissconn;

        public void con(int lLoginID, StringBuilder pchDVRIP, int nDVRPort, int dwUser)
        {

        }

        public string GetString()
        {
            dissconn = new dahuaIp.fDisConnect(con);
            var zdsc = dahuaIp.CLIENT_Init(dissconn, 0);

            return zdsc.ToString();
        }
    }

    [ComVisible(true), Guid("DBE0E8C4-2222-41f3-B6A4-4E2F353D3D05")]
    public interface IMyComSample
    {
        string GetString();
    }

そして、これはこのcomサーバーを使用するためのテストアプリケーションです

Type CSI = Type.GetTypeFromProgID("ComServerSample.MyComServer");
var COMobj = Activator.CreateInstance(CSI);
MethodInfo method = CSI.GetMethod("GetString", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

var sdfc = method.Invoke(COMobj, null);

テストアプリが x86 の場合!この 2 つのアプリケーションは正常に動作します! しかし、テストアプリが x64 の場合、エラーがあります:

次のエラーのため、CLSID {7B9F9A71-8E1B-3470-8A79-EEB4DA9B25A4} を持つコンポーネントの COM クラス ファクトリを取得できませんでした: 80040154 クラスが登録されていません (HRESULT からの例外: 0x80040154 (REGDB_E_CLASSNOTREG))。

どのように問題を解決しますか? x64 アプリケーションで x86 dll を使用する必要があります。

4

1 に答える 1

3

間違ったバージョンの Regasm.exe を使用してクラス ライブラリを登録したため、"クラスが登録されていません" というエラーが発生しています。または、VSに登録させたからです。Regasm の 64 ビット バージョンを使用する必要があります。これは c:\windows\microsoft.net\framework64 サブディレクトリにあります。

ただし、これは実際の問題を解決するものではありません.COMは、プロセス外のCOMサーバーのビット数のギャップを埋めることしかできません. .NET はそれらの作成を直接サポートしていません。インプロセス サーバーのみが簡単です。インプロセス サーバーは EXE のビット数と一致する必要があるため、これは失敗します。

.NET でアウトプロセス COM サーバーを取得するには、COM+ を使用し、ServicedComponent クラスから派生させる必要があります。ステップバイステップの手順を示すハウツー記事はこちら.

率直に言って、これを行うことは先を行っていません。.NET Remoting または WCF を使用して、64 ビット プロセスが 32 ビット コンポーネントをロードする 32 ビット ホスト プロセスと通信できるようにすると、はるかに効果的です。

于 2014-01-09T13:55:59.550 に答える