2012-11-27 128 views
0

首先,我會說我已經搜索了高和低的答案,當我發現了一些對我來說都是胡言亂語,而不是一個C++程序員。編程對我來說只是一種愛好。SafeArrayTypeMismatchException嘗試使用非託管C++ DLL

我在C#winforms項目中使用Visual Studio 2010 Ultimate,以防萬一!

問題是我試圖從非託管DLL(Bo Haglund的Double Dummy Solver)中使用函數。他的自述文件不太有用,並且有關如何使用其DLL的驚人的少(即沒有)文章。

我有我希望使用的DLL函數的原型。

extern "C" __declspec(dllimport) int __stdcall CalcDDtablePBN(struct ddTableDealPBN tableDealPBN, struct ddTableResults * tablep); 

我真的不知道很多關於三分球,但我猜,我會在C#中使用「參考」。

這裏是他的自述功能:

CalcDDtable

CalcDDtable計算的最初52卡雙虛擬值,所有的20個王牌/莊家手的組合。

在調用CalcDDtable之前,必須聲明一個「ddTableResults」類型的結構。 CalcDDtable返回一個狀態整數,「無故障」表示DLL在「ddTableResults」類型結構中提供雙重虛擬分數。 狀態碼:
1 =無故障, 其他狀態代碼爲錯誤,代碼等於SolveBoard狀態代碼。

結構「ddTableDeal」定義要分析的髮卡。結構ddTableDeal { unsigned int cards [4] [4];/*第一個索引是手,第二個索引是適合的,與SolveBoard的deal.remainCards相同。 */ };

struct ddTableResults { /* For each combination trump suit/declarer hand, the DLL provides the double dummy score. */ 
    int resTable[5][4]; /* 1st index is trump (0=Spades, 1=Hearts, 2=Diamonds, 3=Clubs, 4=No Trump 2nd index is declarer hand, 0=North, 1=East, 2=South, 3=West */ 
}; 

CalcDDtablePBN

在CalcDDtablePBN在交易信息中剩餘的牌在PBN文本格式給出,見上文SolveBoardPBN描述。否則,CalcDDtablePBN與CalcDDtable相同。

struct ddTableDealPBN { 
    char cards[80]; 
}; 

我導入的功能如下:

[DllImport("dds.dll")] 
public static extern int CalcDDtablePBN(DDTableDealPBNStruct tableDealPBN, ref DDTableResultsStruct tablep); 

這裏是我的結構:

public struct DDTableDealPBNStruct 
{ 
    public char[] cards; 

    public DDTableDealPBNStruct(char[] pbnCards) 
    { 
     cards = pbnCards; 
    } 
} 

public struct DDTableResultsStruct 
{ 
    public short[,] resTable; /* 1st index is trump (0=Spades, 1=Hearts, 2=Diamonds, 3=Clubs, 4=No Trump 2nd index is declarer hand, 0=North, 1=East, 2=South, 3=West */ 
} 

這是我如何調用該函數:

const string _dealPBN = "N:QJT..AJ76.AKJ765 AK64.AKJ7654..98 32.T932.KQ32.T43 9875.Q8.T9854.Q2"; 
DDTableDealPBNStruct tdPBN = new DDTableDealPBNStruct(_dealPBN.ToCharArray()); 
DDTableResultsStruct results = new DDTableResultsStruct(); 
results.resTable = new short[5, 4]; 
CalcDDtablePBN(tdPBN, ref results); 

當我運行程序時,這是我得到的錯誤消息:

SafeArrayTypeMismatchException未處理。 指定的數組不是預期的類型。

它沒有提到哪個數組是壞的,但我會猜測它是短的[5,4]數組。我嘗試了不同的[MarshalAs(UnmanagedType.blah)]選項無濟於事。誰能告訴我我做錯了什麼?我真的很難過。

我也嘗試了幾個不同的數組類型,int,uint,short,Int16等,再次無濟於事。除非我錯了,它是在抱怨的char []數組?

預先感謝您。

回答

1

您需要描述結構的佈局。

[StructLayout(LayoutKind.Sequential)] 
public struct DDTableResultsStruct 
{ 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
    public int[] resTable; 
} 

似乎有不是一個方式來表達陣列是2維的,所以我剛給出的陣列,就好像它是一維的全尺寸。 (在C中,多維數組在內存中連續佈局。)請注意,元素類型是int,而不是short - 它是32位。你也應該爲其他結構做同樣的事情。

(未經測試的代碼)

+0

謝謝ymett,一旦我將char數組更改爲80的固定長度,這很奏效。 – cjk84