我用C# 2017版本 呼叫一個第三方的dll(老delphi開發),如果在環境中設定目標框架為 .net framework 4 則一切正常,但如果設定目標框架為4.5或者4.7,則直接崩潰,停止作業。
參考方式為:
[DllImport("a.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
//[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string f_b(); //無引數 回傳PChar
請問是什么原因 要怎么調整?
配置管理器為x86.
uj5u.com熱心網友回復:
一般這類的組件 和 .net版本沒有關聯;下載一個dependency,查找一下依賴關聯: http://www.dependencywalker.com/
uj5u.com熱心網友回復:
先謝謝。
查dll的依賴關聯嗎?
所有代碼、環境不變,只切換一下目標框架,就一個正常運行,一個崩潰(直接提示停止作業),我也要奔潰了。。
uj5u.com熱心網友回復:
.net framework 版本問題,不是自己能解決的變通的方法是 用 4 創建一個類別庫引入第三方的dll,并轉換為 C# 方法
在 4.5 專案中參考上面創建的dll。總不能說 .net framework 自己的dll 也不能參考吧?
uj5u.com熱心網友回復:
我用4下引入第三方dll 生成一個新的dll
但是在呼叫新的dll時,現象是一樣的,目標框架為 .net framework 4 則一切正常,但如果設定目標框架為4.5或者4.7,則直接崩潰
參考dll中特定版本屬性 True和False都試過
uj5u.com熱心網友回復:
你是說 4.5 不能使用 4 生成的 dll是這個意思嗎?
我沒那么多環境,無法測驗
uj5u.com熱心網友回復:
他這個是參考非net生成的dll,不是netdll版本的依賴項問題uj5u.com熱心網友回復:
最近遇到同樣的問題,不知道如何解決,樓主解決了嗎?呼叫了微軟DLL的,就是本來框架是4.5.2的,直接改框架為4.0,然后能夠在4.0環境下運行了,不過一些DLL里的函式呼叫不成功,樓主知道怎么回事嗎?uj5u.com熱心網友回復:
對,我用4生成一個dll 只能在4下呼叫,換成4.5就崩潰
不需要很多環境,只需要有2015或者2017就可以,切換一下目標框架就行
如果你有時間幫忙,我可以把原始dll發給你
謝謝
uj5u.com熱心網友回復:
對,但不知道不同的框架對dll有什么區別,有沒有可能改呼叫方式或者引數型別可以解決的?
uj5u.com熱心網友回復:
還在研究中。。
4下沒問題,4.5、4.7下直接停止作業
uj5u.com熱心網友回復:
我是可以運行,但是呼叫DLL就不成功,只有在4.5.2跟4.6版本的NET下才可以正常使用,我是呼叫DLL做USB通信的,呼叫不成功DLL連接不上檢測不到USB設備uj5u.com熱心網友回復:
樓主我問題解決了,只有配置管理器配置成X86即可,實測有效,你可以試試,一開始我的配置是Any CPU 的uj5u.com熱心網友回復:
我一直設為x86的
多謝
uj5u.com熱心網友回復:
參考 1 樓 yeness 的回復:一般這類的組件 和 .net版本沒有關聯;
下載一個dependency,查找一下依賴關聯: http://www.dependencywalker.com/
uj5u.com熱心網友回復:
NET呼叫其他語言dll,如C++不存在.NET版本的依賴性差異另外給你說一下X86,X64與AnyCPU的差異
X86只能運行在32的CLR 上面
X64只能運行在64位CLR 上面
AnyCPU既可以運行在32位上面也可以運行在64位上面,但不是說使用AnyCPU就不會有問題
如果你的電腦是64位則AnyCPU會運行在64位CLR上面,如果這個時候你使用的三方dll有32的,則會出現呼叫失敗的現象
相對的如果你的電腦是32則AnyCPU會運行在32位的CLR上面
uj5u.com熱心網友回復:
選X86 然后方法入口 回傳值用 IntPtr dephi 回傳值用pchar c#使用的時候轉成string,怎么轉百度一下就行.uj5u.com熱心網友回復:
正解!
uj5u.com熱心網友回復:
這個問題解決了嗎?我同樣遇到這個問題,回傳值用intPtr就可以嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/net/50908.html
標籤:C#
下一篇:VS C#的問題!
