我創建了一個C DLL
,以便我可以在我的C#
應用程序中使用它。
我在C++
測試應用程序上測試了DLL
,它工作正常,但它在C#應用程序中不起作用。
由於某些原因,我無法構建DLL
的調試版本,因此我無法在調試模式下運行C#
應用程序。
DLL
調試配置不會找到include directories
,在發佈模式,它工作得很好!
我需要說的是,我在下面給出了一個特定的方法,導致崩潰,調用DLL
中的其他方法是正常的,並按預期工作。 這是主要的實現:
頭定義:從C#windows應用程序調用C DLL會導致svchost.exe崩潰
//use this function to classify an image
CDLL_API const char* Classify(const char* img_path, int N = 2);
的.cpp實現
CDLL_API const char* Classify(const char * img_path, int N)
{
auto classifier = reinterpret_cast<Classifier*>(GetHandle());
std::vector<PredictionResults> result = classifier->Classify(std::string(img_path), N);
std::string str_info = "";
std::stringstream ss;
for (size_t i = 0; i <result.size(); ++i)
{
auto label = result[i].label;
auto acc = result[i].accuracy;
ss << "label=" << label << ",acc=" << acc << "|";
}
return ss.str().c_str();
}
C#代碼:
[DllImport(@"CDll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern string Classify([MarshalAs(UnmanagedType.LPStr)]string img_path,int N = 2);
//...
var s = Classify(txtFilePath.Text, 2);
MessageBox.Show(s);
所以我完全擺脫的想法什麼可能是真正的原因。
您使用'CallingConvention.Cdecl'而不是'CallingConvention.StdCall'的任何特定原因? – stuartd
@stuartd:這實際上來自我幾年前寫的代碼,我不記得爲什麼我選擇Cdecl而不是StdCall!順便說一句,當我測試它時,StdCall也有同樣的問題 – Breeze