我用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.

解决方案 »

  1.   

    一般这类的组件 和 .net版本没有关联;下载一个dependency,查找一下依赖关联: http://www.dependencywalker.com/
      

  2.   


    先谢谢。
    查dll的依赖关联吗?
    所有代码、环境不变,只切换一下目标框架,就一个正常运行,一个崩溃(直接提示停止工作),我也要奔溃了。。
      

  3.   

    .net framework 版本问题,不是自己能解决的
    变通的方法是 用 4 创建一个类库引入第三方的dll,并转换为 C# 方法
    在 4.5 项目中引用上面创建的dll。总不能说 .net framework 自己的dll 也不能引用吧?
      

  4.   


    我用4下引入第三方dll 生成一个新的dll 
    但是在调用新的dll时,现象是一样的,目标框架为 .net framework 4 则一切正常,但如果设置目标框架为4.5或者4.7,则直接崩溃
    引用dll中特定版本属性 True和False都试过
      

  5.   

    你是说 4.5 不能使用 4 生成的 dll
    是这个意思吗?
    我没那么多环境,无法测试
      

  6.   

    他这个是引用非net生成的dll,不是netdll版本的依赖项问题
      

  7.   

    最近遇到同样的问题,不知道如何解决,楼主解决了吗?调用了微软DLL的,就是本来框架是4.5.2的,直接改框架为4.0,然后能够在4.0环境下运行了,不过一些DLL里的函数调用不成功,楼主知道怎么回事吗?
      

  8.   


    对,我用4生成一个dll 只能在4下调用,换成4.5就崩溃不需要很多环境,只需要有2015或者2017就可以,切换一下目标框架就行
    如果你有时间帮忙,我可以把原始dll发给你
    谢谢
      

  9.   


    对,但不知道不同的框架对dll有什么区别,有没有可能改调用方式或者参数类型可以解决的?
      

  10.   

    我是可以运行,但是调用DLL就不成功,只有在4.5.2跟4.6版本的NET下才可以正常使用,我是调用DLL做USB通信的,调用不成功DLL连接不上检测不到USB设备
      

  11.   

    楼主我问题解决了,只有配置管理器配置成X86即可,实测有效,你可以试试,一开始我的配置是Any CPU 的
      

  12.   

    引用 1 楼 yeness 的回复:
    一般这类的组件 和 .net版本没有关联;下载一个dependency,查找一下依赖关联: http://www.dependencywalker.com/
      

  13.   

    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上面
      

  14.   

    选X86 然后方法入口 返回值用 IntPtr   dephi 返回值用pchar c#使用的时候转成string,怎么转百度一下就行.