• [转]关于VS2005智能设备中无法找到PInvoke DLL问题


    http://apps.hi.baidu.com/share/detail/18557255


    无法找到 PInvoke DLL “*.dll“,网上查了一些相关资料:


    1、Can’t
    find P/Invoke DLL sqlcemeNN.dll

       
    目前的错误是什么?
        1) Can't find P/Invoke DLL sqlceme30.dll
    2) Can't find P/Invoke DLL sqlceme35.dll
        3) Can't find P/Invoke DLL
    sqlceme40.dll
        这个错误到底什么意思?
       
    当一个托管组件(这里是System.Data.SqlServerCe.dll)试图调用一个原生DLL(这里是sqlcemeNN.dll,NN代表产品的版本号30,35,等),系统没有找到那个要装载并调用其方法的DLL。
       
    何时我们会碰到这个错误?
        当系统在系统目录或当前进程的执行目录找不到需要的DLL时,就会出现这个错误。
       
    如何处理这个错误?可能的修复方法是什么?
        有多种情况,下面是最常见的:
        1) 在.NET CF
    SP2之前,在存储卡上没有GAC的概念。如果你在存储卡上安装了SQL CE,在设备上安装了.NET CF 2.0
    RTM/SP1,结果原生DLL就在存储卡上,而GAC在主存。因此,托管组件调用方法就会失败。


           a. 请使用.NET CF SP2以上版本。
            b.
    请在主存储器安装cab文件。
           c. 请更新到SQL CE 3.0 SP2/3.1或以上。



        2) 你在开发智能设备(基于Windows
    CE操作系统)上的应用程序,并且使用了Visual Studio自动部署(F5)特性。VS在把System.Data.SqlServerCe.dll
    映射到CAB文件时失败,只部署了System.Data.SqlServerCe.dll(注意:不会报错)。在这种情况下,原生DLL没有部署。
           
    a. 取消自动部署。 (别问我怎么做)
           b. 从项目中移除,然后重新添加 System.Data.SqlServerCe 的引用。 因为,
    VS 在项目文件保存了组件id. 而我们改变了SQL CE 3.5 SP1中的组件版本,移除再添加就会更新解决方案,引用正确的组件版本。
          
    c. 手动拷贝安装SQL CE 的所有3个CAB文件,它们在以下目录:

    %VisualStudioInstallRoot%\SmartDevices\SDK\SQL Server\Mobile\v3.5\
    <platform>\ <processor>
    或 %ProgramFiles%\Microsoft SQL Server
    Compact Edition\3.5\Devices\ <platform>\ <processor>



        3)
    系统加载sqlcemeNN.dll.失败。关于为什么系统加载模块失败的更多的细节,在我之前的一个blog(译注:中文翻译在这里)中有讨论。


        4)
    如果你的机器是64位的,你可能陷入了默认的目标平台“任何CPU”的陷阱,请设置目标平台为“x86”。如需要更多详情,请访问ErikEJ的博客



        5) 对于所有其他的情况,请升级到SQL CE 3.0 SP2/3.1
    以上。如果可能,确保HKLM\Software\Microsoft\Microsoft SQL Server Compact
    Edition\<Version>\NativeDir
    注册表指向原生DLL的安装目录。如果运行在WoW模式,请考虑WoW注册表。
    来自:
    http://blog.csdn.net/flyjimi/archive/2008/12/11/3500606.aspx


    PS:这个问题以前用SQLCE时碰到,解决方法类似^_^


    2、法二如下
       
    在vs.net2005中将×.dll设置为"如果较新则复制";“DLLName=com.dll“;这样dll就和你的程序在同一个目录下了;


        PS:有人这样顺利解决问题
    原文:
    http://www.cnblogs.com/CowboyProgrammer/archive/2009/03/19/1416419.html


    3、有时候是这样造成的:
        C#
    不支持MFC类,用MFC应该选静态链接的类型;不要选MFC扩展DLL

    原文:
    http://topic.csdn.net/u/20071128/16/96b28e14-5137-4be0-a16a-0fe22e0b3afe.html


    4、编译的原因:要将DLL编译成与PDA的CPU和系统相符的。
       
    前两天有客户需要在pda上运行的坐标转换程序,为了保护我们的坐标转换算法,用evc++4.0做了一个本地的DLL文件,生成基于模拟器的dll,在vs.net
    2003的模拟器上用evc测试没有问题。但给用户使用后说是无法用,原来他们是在vs.net
    2005上用c#调用该dll,用的是动态加载的方式,但提示说:PInvoke DLL “*.dll”;


       
    查了很多资料,确定将该dll放在windows目录下和放在程序所在目录下应该都能识别该dll文件,这些都没有问题,最后只能考虑是不是dll写得有问题,查了资料后也确认dll写法没有问题,现在问题就落到编译目标和模拟器环境的问题上了;最后发现,2005里带的模拟器是基于arm的,所以必须在evc中编译为arm目标的dll才能使用。主要是不熟悉pda开发了

  • 相关阅读:
    Git 在Idea下的操作
    负载均衡算法-java实现
    MySQL 上亿大表优化实践 转
    盘点 10 个代码重构的小技巧
    wireshark抓包工具详细说明及操作使用
    限流
    Semaphore
    CyclicBarrier
    CountDownLatch和枚举配合使用
    ReentrantReadWriteLock读写锁
  • 原文地址:https://www.cnblogs.com/luqingfei/p/2426427.html
Copyright © 2020-2023  润新知