2012-12-29 60 views
2

對於我的一個項目,我想包裝一個C結構以便在C#代碼中使用它。 我的C++算法返回一個結構對象,我希望看到來自C#/ WPF代碼的包含信息。包裝一個C結構在WPF應用程序中訪問

當我嘗試「我的路」,我得到一個錯誤信息,而編譯: 「‘Wrapper.WrapperAlgo.createMediumMap()’不可訪問由於其保護級別」

我的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++與結構algo.h我想用C#

#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(); 
}; 

你知道我錯了嗎?

+0

您的C#代碼包含對struct的引用,即square **。這甚至有可能嗎? – Icarus3

回答

2

如果我理解你,你正在尋找一種方法來在你的C#代碼中使用非託管庫(如cpp/c庫)。如果是,那麼你應該閱讀關於編組,例如。 hereherehere

關於在C#應用程序中包含非託管代碼的基礎知識可以在MSDNMSDN Magazine上找到。

希望它有幫助。