2

私のプロジェクトでは、C# コードで使用するために C 構造体をラップしたいと考えています。私の C++ アルゴリズムは構造体オブジェクトを返します。C#/WPF コードから含まれている情報を確認したいと考えています。

「私のやり方」を試みると、コンパイル中にエラー メッセージが表示されます。

私のC#コード:

public partial class MainWindow : Window
{    
    unsafe public MainWindow()
    {
        WrapperAlgo algo = new WrapperAlgo();
        square** map = (square**)algo.createMediumMap();
    }
}

私のラッパー

#ifndef __WRAPPER__
#define __WRAPPER__

#include "../CivilizationAlgo/mapalgo.h"
#pragma comment(lib, "../Debug/CivilizationAlgo.lib")

using namespace System;

namespace Wrapper {
    public ref class WrapperAlgo {
        private:
            Algo* algo;
    public:
        WrapperAlgo(){ algo = Algo_new(); }
        ~WrapperAlgo(){ Algo_delete(algo); }
        square** createSmallMap() { return algo->createSmallMap(); }
        square** createMediumMap() { return algo->createMediumMap(); }
        int computeFoo() { return algo->computeFoo(); }
    };
}
#endif

C# で使用したい構造体を含む C++ algo.h

#ifdef WANTDLLEXP
#define DLL _declspec(dllexport)
#define EXTERNC extern "C"
#else
#define DLL
#define EXTERNC
#endif

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;

struct square {
    // 0: Mountain, 1: Plain, 2: Desert
    int type;
    // 0: No additionnal ressource, 1: Additionnal Iron, 2: Additionnal Food
    int bonus;
    // 0: free, 1: checked, 2: frozen
    int state;
};

class DLL Algo {
    public:
        Algo() {}
        ~Algo() {}
        square** createSmallMap();
        square** createMediumMap();
        int computeFoo();
};

どこが間違っているか分かりますか?

4

1 に答える 1

2

C# コードで非管理ライブラリ (cpp/c ライブラリなど) を使用する方法を探していることをよく理解しています。はいの場合は、マーシャリングについて読む必要があります。ここここ、またはここ

アンマネージ コードを C# アプリに含める方法の基本については、MSDNまたはMSDN Magazineを参照してください。

それが役に立てば幸い。

于 2012-12-30T00:09:47.513 に答える