net framework版本不同导致调用第三方DLL异常

chaosbird 2018-10-29 01:17:19
我用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.
...全文
1889 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
码农小畜畜 2021-03-10
  • 打赏
  • 举报
回复 1
我昨天在调用一个dll也出现了这样的问题, 当4.0环境下正常接出参一个string类型, 切换4.5之后程序崩溃, 我这里尝试接收string换成IntPtr, 然后寻址查字符串可以拿到出参, 4.5环境下是正常的, 代码如下
IntPtr ptr = WebApply("1213", "", "", "");
var st = Marshal.PtrToStringAnsi(ptr);
lifang198902 2020-04-15
  • 打赏
  • 举报
回复
这个问题解决了吗?我同样遇到这个问题,返回值用intPtr就可以吗?
qq_32151287 2020-03-06
  • 打赏
  • 举报
回复
引用 20 楼 k. 的回复:
选X86 然后方法入口 返回值用 IntPtr dephi 返回值用pchar c#使用的时候转成string,怎么转百度一下就行.
正解!
k. 2018-11-12
  • 打赏
  • 举报
回复
选X86 然后方法入口 返回值用 IntPtr dephi 返回值用pchar c#使用的时候转成string,怎么转百度一下就行.
大鱼> 2018-11-09
  • 打赏
  • 举报
回复
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上面
weixin_43653865 2018-11-09
  • 打赏
  • 举报
回复
引用 1 楼 yeness 的回复: 一般这类的组件 和 .net版本没有关联; 下载一个dependency,查找一下依赖关联: http://www.dependencywalker.com/
chaosbird 2018-10-30
  • 打赏
  • 举报
回复
引用 12 楼 qq_36970553 的回复:
楼主我问题解决了,只有配置管理器配置成X86即可,实测有效,你可以试试,一开始我的配置是Any CPU 的


我一直设为x86的

多谢
qq_36970553 2018-10-30
  • 打赏
  • 举报
回复
楼主我问题解决了,只有配置管理器配置成X86即可,实测有效,你可以试试,一开始我的配置是Any CPU 的
qq_36970553 2018-10-29
  • 打赏
  • 举报
回复
我是可以运行,但是调用DLL就不成功,只有在4.5.2跟4.6版本的NET下才可以正常使用,我是调用DLL做USB通信的,调用不成功DLL连接不上检测不到USB设备
chaosbird 2018-10-29
  • 打赏
  • 举报
回复
引用 7 楼 qq_36970553 的回复:
最近遇到同样的问题,不知道如何解决,楼主解决了吗?调用了微软DLL的,就是本来框架是4.5.2的,直接改框架为4.0,然后能够在4.0环境下运行了,不过一些DLL里的函数调用不成功,楼主知道怎么回事吗?


还在研究中。。
4下没问题,4.5、4.7下直接停止工作
chaosbird 2018-10-29
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
他这个是引用非net生成的dll,不是netdll版本的依赖项问题


对,但不知道不同的框架对dll有什么区别,有没有可能改调用方式或者参数类型可以解决的?
chaosbird 2018-10-29
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
你是说 4.5 不能使用 4 生成的 dll
是这个意思吗?
我没那么多环境,无法测试


对,我用4生成一个dll 只能在4下调用,换成4.5就崩溃

不需要很多环境,只需要有2015或者2017就可以,切换一下目标框架就行
如果你有时间帮忙,我可以把原始dll发给你
谢谢
qq_36970553 2018-10-29
  • 打赏
  • 举报
回复
最近遇到同样的问题,不知道如何解决,楼主解决了吗?调用了微软DLL的,就是本来框架是4.5.2的,直接改框架为4.0,然后能够在4.0环境下运行了,不过一些DLL里的函数调用不成功,楼主知道怎么回事吗?
  • 打赏
  • 举报
回复
他这个是引用非net生成的dll,不是netdll版本的依赖项问题
xuzuning 2018-10-29
  • 打赏
  • 举报
回复
你是说 4.5 不能使用 4 生成的 dll
是这个意思吗?
我没那么多环境,无法测试
chaosbird 2018-10-29
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
.net framework 版本问题,不是自己能解决的
变通的方法是 用 4 创建一个类库引入第三方的dll,并转换为 C# 方法
在 4.5 项目中引用上面创建的dll。总不能说 .net framework 自己的dll 也不能引用吧?


我用4下引入第三方dll 生成一个新的dll
但是在调用新的dll时,现象是一样的,目标框架为 .net framework 4 则一切正常,但如果设置目标框架为4.5或者4.7,则直接崩溃
引用dll中特定版本属性 True和False都试过
xuzuning 2018-10-29
  • 打赏
  • 举报
回复
.net framework 版本问题,不是自己能解决的
变通的方法是 用 4 创建一个类库引入第三方的dll,并转换为 C# 方法
在 4.5 项目中引用上面创建的dll。总不能说 .net framework 自己的dll 也不能引用吧?
chaosbird 2018-10-29
  • 打赏
  • 举报
回复
引用 1 楼 yeness 的回复:
一般这类的组件 和 .net版本没有关联;

下载一个dependency,查找一下依赖关联: http://www.dependencywalker.com/


先谢谢。
查dll的依赖关联吗?
所有代码、环境不变,只切换一下目标框架,就一个正常运行,一个崩溃(直接提示停止工作),我也要奔溃了。。
xuan.ye 2018-10-29
  • 打赏
  • 举报
回复
一般这类的组件 和 .net版本没有关联; 下载一个dependency,查找一下依赖关联: http://www.dependencywalker.com/

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧