我有現有的C#代碼,簽名Foo(long[][] longs)
,我需要調用非託管C++(而不是 C++/CLI)。我似乎無法弄清楚__gc[]
和__gc*
的正確組合,以使編譯器感到滿意。如何從Managed C++(舊語法)調用Foo(long [] [])(C#)?
用C++/CLI,這是直接的:
std::vector<__int64> evens;
evens.push_back(2); evens.push_back(4); evens.push_back(6); evens.push_back(8);
std::vector<__int64> odds;
odds.push_back(1); odds.push_back(3); odds.push_back(5); odds.push_back(7);
std::vector<std::vector<__int64> > ints;
ints.push_back(evens); ints.push_back(odds);
array<array<__int64>^>^ mgdInts = gcnew array<array<__int64>^>(ints.size());
for (size_t i = 0; i<ints.size(); ++i)
{
const std::vector<__int64>& slice = ints[i];
mgdInts[i] = gcnew array<__int64>(slice.size());
for (size_t j=0; j<slice.size(); ++j)
mgdInts[i][j] = slice[j];
}
編輯:由於我使用Visual Studio 2008中, 「簡單」 的解決辦法是把C++/CLI代碼在其自己的文件和編譯與/clr;當然,如果我不必這樣做(例如,使用Managed C++的其他.h文件),它會更容易。 C#代碼無法更改,因爲它是從Web引用自動生成的。
的C#代碼「不能」的變化,我想編寫一個文件,/ CLR(VS 2008)可能是更直接的比這個。 – 2009-10-16 21:18:59
是的。 如果由於某種原因你不想要任何C++/CLR代碼,那麼解決它的另一種方法是創建另一個可以控制的C#對象,它具有符合類型庫的接口幷包裝原始代碼。 – zumalifeguard 2009-10-16 23:54:31