opencv的c++程序封裝成dll用c#調用,遇見的問題

先看文章最後一句話

1.問題一:無法加載DLL,找不到指定的模塊

解決辦法:把你用的dll放在你自己程序的啓動路徑下。比如bin/debug/....或者x64/debug/.....

如果不知道應該放哪裏,就都試試哪個文件夾都試試,再一個一個刪除,看看哪個會影響程序運行,就是這個文件夾了

 

問題二:試圖加載格式不正確的程序

解決辦法:因爲平臺設置不正確,看看你的平臺是什麼,跟編譯dll的平臺一樣嗎?

覈對:(C#配置和C++)代碼配置

 如果發現自己編譯的opencv的c++代碼是x64的而c#程序不能用x64,那就只能重新編譯一個win32的x86或者win32的win32程序。注意編譯dll前需要配置win32也就是x86版本的opencv,具體配置方法和x64的配置方法一樣,只是要選擇x86的文件夾下的bin進行配置,然後再編譯dll(參考配置x64配置自己的x86)。請注意:有的opencv自帶x86版本,如opencv2.4.13,有的只有x64版本,需要自己用Cmake編譯,還要注意配置時候自己VS選擇的版本。然後將引用dll的c#程序加一句話,如下:

[DllImport("PackageDll.dll", EntryPoint = "CutPic", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CutPic(string path);

C#默認調用的是__Stdcall

 

問題三:外部組件發生異常

解決辦法:單步調式,看是不是參數傳錯了,看是不是找不到要處理的文件,看是不是C++和C#的傳參值有問題(如C#用string類型,C++的形參要用char *)

問題四:.NETFramework,Version不匹配問題

解決辦法:在啓動程序的app.config文件中加入運行時動態變化.NETFramework,Version版本,如:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  <supportedRuntime version="v2.0.50727"/>
</startup>

x86版本示例:https://download.csdn.net/download/qq_40155090/12004885 

 

切記:代碼執行的時候,要重新生成解決方案,每次改東西都重新生成,即使改傳入的參數,也要重新生成解決方案,很重要、很重要、很重要 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章