1

参照としてこれにつながった私の他の質問は次のとおりです: アンマネージ C++ からマネージ C++ メソッドを呼び出す方法

C# COM ファイルの作成に成功しました。ここで、アンマネージ C++ での実装方法について簡単な説明が必要です。

この例に従っていますが、c++ の部分が弱いです。 http://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C

ここに私のCOMファイルがあります

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace cSharpRiJHarn
{
    [Guid("ED1483A3-000A-41f5-B1BC-5235F5897872")]
    public interface DBCOM_Interface
    {
        [DispId(1)]
        String encrypt(string s);
        [DispId(2)]
        String decrpyt(string s);
    }

    [Guid("A6BCEC1D-B60C-4c97-B9AD-1FE72642A9F8"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface DBCOM_Events
    {
    }

    [Guid("7C13A8C6-4230-445f-8C77-0CA5EDECDCB5"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(DBCOM_Events))]
    public class RijndaelLink : DBCOM_Interface
    {
        public String encrypt(String s)
        {
            return Rijndael.EncryptString(s); 
        }
        public String decrpyt(String s)
        {
            return Rijndael.DecryptString(s);
        }
    }
}

アンマネージ コードでこれを使用するための非常に基本的な例が必要です。回答に含めてください:

  • プロジェクトを含める必要がありますか、それとも COM のソース ファイルだけを含める必要がありますか?
  • 参照を追加する必要がありますか
  • 文字列を渡して cout で出力する非常に基本的な例です。

ご協力いただきありがとうございます!

4

1 に答える 1

5

最初に行う必要があるのは、COM オブジェクトを .NET で適切に定義し、アンマネージド ワールド (C++ またはその他) で使用できるようにすることです。ここにまともな定義があります:

namespace cSharpRiJHarn
{
    [Guid("ED1483A3-000A-41f5-B1BC-5235F5897872")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComVisible(true)]
    public interface IRijndaelLink
    {
        string encrypt(string s);
        string decrypt(string s);
    }

    [Guid("7C13A8C6-4230-445f-8C77-0CA5EDECDCB5")]
    [ComVisible(true)]
    public class RijndaelLink : IRijndaelLink
    {
        public string encrypt(string s)
        {
            return Rijndael.EncryptString(s); 
        }

        public string decrypt(string s)
        {
            return Rijndael.DecryptString(s); 
        }
    }
}

次に、RegAsmツールを使用して、この .NET アセンブリを COM に登録する必要があります。また、次のようなタイプ ライブラリ (.TLB)をビルドすることをお勧めします(X64 ではなく、X86 用に全体をビルドするとします)。

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe YourAssembly.dll /tlb:YourAssembly.tlb /codebase

実際のパスに合わせてください。また、本番環境では必要ない可能性があるため、codebase arg も確認してください。

これにより、内部にインターフェイスとクラスの両方を含む .TLB ファイルがビルドされます。ComVisible属性を追加したため、機能します。このサンプルでは、​​COM オートメーション(VB、VBA) もスクリプト言語 (VBScript、JScript) のサポートも必要なく、はるかに使いやすい IUnknown インターフェイスのみが必要であるため、Dispatch または Dual インターフェイスを定義していないことにも注意してください。 IDispatch インターフェイスよりもプレーンな C/C++ で。

現在、Microsoft 固有の C++ 拡張機能を使用して、アンマネージC++ の世界でそれをインポートする簡単な方法があります。COM オブジェクトを使用するコンソール アプリケーションの例を次に示します。

#include "stdafx.h"
#import  "c:\MyPathToTheTlb\YourAssembly.tlb" // import the COM TLB

using namespace YourAssembly;

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL); // needed to enter COM space
    IRijndaelLinkPtr ptr(__uuidof(RijndaelLink)); // create the COM Object with the desired interface
    _bstr_t s = ptr->encrypt("hello"); // call the function
    printf("%S", (LPWSTR)s); // for example
    CoUninitialize();
    return 0;
}

#import ディレクティブは、文字列処理用のクールなラッパー (_bstr_t、.NET 文字列はここでオートメーション BSTR としてエクスポートされるため、IUnknown インターフェイスの場合でも) も作成することに気付くでしょう。したがって、それほど大したことではありません。

これがすべて機能する唯一の方法ではありませんが、これは最も単純な方法の 1 つです。

于 2013-04-03T22:02:52.873 に答える