5

以下の更新をご覧ください

(解決済み) また、これを次の 2 番目の質問に拡張しました。C# DLL COM ファイルをアンマネージ C++ プログラムに実装します。

私はこれをインターネットの最後まで調査しましたが、これを行う方法の実際の、理解可能な、人間の例は見つかりませんでした.

テキストを暗号化および復号化する C# DLL があります。

これを C++ のアンマネージ コードで書き直す知的能力は望んでいません / ありません。その代わりに、C# dll とインターフェイスする C++/CLR クラスを作成しました。

ここで、アンマネージ コードからマネージ C++ を呼び出す方法を知る必要があります。

これが私の管理されたコードで、動作することが確認されています

// clrTest.cpp : main project file.

#include "cSharpRiJHarn"
#include "stdafx.h"
#include <string>
#include <stdio.h>

using namespace cSharpRiJHarn;
using namespace System;


String^ Encrypt(String ^s)
{
    return  RijndaelLink::encrypt(s);   
}


String^ Decrypt(String ^s)
{
    return  RijndaelLink::decrpyt(s);   
}

int main()
{   
     //Console::WriteLine(Encrypt("It Works"));

     //Console::WriteLine(Decrypt(Encrypt("It Works")));

     //Console::ReadLine();
     return 0;
}

今もう一度私はこれを研究しました。

私はすべての悪い/過度に複雑な説明を見てきました

COM または Interop と呼ばれるものを使用する必要があることはわかっています

これがどのように機能するのかわかりません。非常に簡単な説明を探しています。

助けてくれてありがとう。

アップデート

C# DLL を COM ファイルに変換しました

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

namespace cSharpRiJHarn
{
    [Guid("GuiD CODE REMOVED")]
    public interface DBCOM_Interface
    {
        [DispId(1)]
        String encrypt(string s);
        [DispId(2)]
        String decrpyt(string s);
    }

    [Guid("GuiD CODE REMOVED"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface DBCOM_Events
    {
    }

    [Guid("GuiD CODE REMOVED"),
    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);
        }
    }
}

アンマネージ C++ でこれを実装する方法を知る必要があります... ファイルだけを C++ プロジェクトに追加することと、cSharpRiJHarn プロジェクト全体をこのソリューションに追加することの両方を試みました。どちらも機能しません。

#import "cSharpRiJHarn" 
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include <iostream>
//using namespace cSharpRiJHarn;


int main(){

    cSharpRiJHarn::RijndaelLink::encrypt("It works");
    char ch;
    std::cin>>ch;
    return 0;
}

これは私が得ているエラーの1つです。

エラー 6 エラー C2653: 'cSharpRiJHarn': クラスまたは名前空間の名前ではありません

エラー 8 IntelliSense: ソース ファイルを開けません "C:/.../.../Documents/Visual Studio 2010/Projects/unmannagedCPPExample/unmannagedCPPExample/Debug/cSharpRiJHarn.tlh" c:......\documents\visual studio 2010\projects\unmannagedcppexample\unmannagedcppexample\unmannagedcppexample.cpp

4

2 に答える 2

2

次のような、Microsoft が提供するクールなC++ マーシャリング ライブラリを使用できます。

#include "cSharpRiJHarn"
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include "msclr\marshal_cppstd.h" // marshaling library

using namespace cSharpRiJHarn;
using namespace System;
using namespace msclr::interop; // marshaling library

std::wstring Encrypt(std::wstring s)
{
    return marshal_as<std::wstring>(RijndaelLink::encrypt(marshal_as<String^>(s)));
}

std::wstring Decrypt(std::wstring s)
{
    return marshal_as<std::wstring>(RijndaelLink::decrypt(marshal_as<String^>(s)));
}
于 2013-04-02T21:32:14.103 に答える
0

まず、メソッドString^は管理対象オブジェクトである を受け取り、返します。アンマネージ コードはこの型を認識しないため、そのようなオブジェクトを作成できません。そのため、関数呼び出しをラップして、関数がマネージド型をアンマネージド コードが理解できるものにマーシャリングするようにする必要があります。

その後、ここで説明するように、DllExport 属性をマネージ メソッドに追加できます。

于 2013-04-02T20:04:03.830 に答える