首先,我會說我已經搜索了高和低的答案,當我發現了一些對我來說都是胡言亂語,而不是一個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 []數組?
預先感謝您。
謝謝ymett,一旦我將char數組更改爲80的固定長度,這很奏效。 – cjk84