由于项目中调用了动态库,这些动态库放在C:\Windows\System32下面,但是当部署到了64位的机器上可能就有问题了,最近这个问题就纠结了半天,在本机32为系统上测试动态调用ddl成功了,部署到64位Window Server2008上面也没问题,可是为什么到了64位的WIN7系统上出了问题呢?
最后才发现原来原来是DLL的位置不对,那么DLL到底该放到那呢?
如果细心的你,你会发现在C:\Windows\目录下面有两个文件夹:System目录和System32目录,其实System目录是Windows 3.x遗留下来的,用来保持Windows的对一些旧的应用程序的向下兼容性。一般说来,16位的DLL文件(以及其它的支持文件)被存放在\Windows\System文件夹里,32位DLL文件和不同支持文件被存放在\Windows\System32文件夹里。
32位版本的Windows保持16位和32位DLL文件的方式是非常简单的,但是64位版本的Windows保持64位和32位DLL文件的方式就不这么简单了。
理论上说,微软将要创建一个名为\Windows\System64的文件夹来用其存放64位DLL文件,但是取而代之的是,微软创建了一个新的名为SysWOW64的文件夹来存放32位的DLL文件。第一眼看起来,让人感觉这个文件夹应该存放64位应用程序的,但是注意,32位应用程序本来应该存放它们的DLL文件到\Windows\System32文件夹里面。 Windows\System32文件夹在64位版本的Windows内仍然存在。但是微软使用这个文件夹做为64位DLL的仓库,而不是32位DLL文件的。我不清楚微软使Windows\System32文件夹来存放64位DLL的原因,但是我听说这么做是为了向下兼容性。
当你安装一个32位的应用程序,安装向导通过WOW64 emulato运行。32位和64位代码并不混和。一旦一个应用程序(包括一个安装向导)从WOW64 emulator开始运行,它必须接着在WOW64内继续运行。这意味着当你安装一个应用程序,安装向导并不知道这个程序被安装到64位版本的Windows内,并且和它运行在32位操作系统一样把DLL文件写到\Windows\System32文件夹里面。
当然,WOW64知道安装向导通过emulator来运行的32位应用程序。同时也知道64和32位代码不能混合在一起。所以,WOW64 emulator 给\Windows\SysWOW64创建一个别名。这意味着任何时候32位应用程序要写入到\Windows\System32文件夹或者从\Windows\SysWOW64文件夹读取,WOW64 emulator都能使其改道到\Windows\SysWOW64文件夹。
最后将动态库丢到C:\Windows\SysWOW64目录下就OK了
分享到:
相关推荐
### C#动态调用DLL的研究 #### 一、引言 在软件开发中,动态链接库(DLL)是非常重要的组成部分,特别是在.NET框架下利用C#进行编程时。本文旨在探讨如何将一个动态链接库(DLL)作为一个资源嵌入到可执行文件中,...
3. **C++动态库调用C动态库**:由于C语言的ABI(应用程序二进制接口)兼容性,C++代码可以直接调用C语言编写的DLL。只需确保C++函数声明遵循C语言的命名约定(通常是extern "C"),并且C语言的DLL导出函数不使用C++...
对于C#调用VC++生成的非托管DLL,情况相对简单,因为非托管DLL可以直接被任何支持DLL导入的语言调用。但是,当C#需要调用托管的VC++ DLL时,需要使用PInvoke(Platform Invoke)或者C++/CLI来创建一个桥接层,使C#...
在.NET环境中,C#语言能够调用非托管代码,如C++编译生成的动态链接库(DLL),以便利用C++的性能优势和特定库功能。这个过程涉及到平台调用(P/Invoke)和互操作性,使得两种不同编程语言之间能够无缝通信。下面将...
本示例展示的是如何让Visual FoxPro (VFP) 调用C#编写的动态链接库(DLL)。这一技术的应用场景非常广泛,例如在需要跨平台或跨语言开发时,通过这种方式可以让各个部分协同工作。 #### 知识点二:创建可被VFP调用...
本主题聚焦于“通过C#调用共享MFC C++项目DLL”的过程,这涉及到COM(组件对象模型)技术、DLL(动态链接库)的使用以及C++/CLI作为桥梁的角色。 首先,MFC(Microsoft Foundation Classes)是微软提供的一个C++...
二、C#调用DLL的方法 在C#中调用非托管DLL(通常是基于Win32 API的DLL)需要使用`DllImport`特性来声明外部方法。基本步骤如下: 1. 引入命名空间:`using System.Runtime.InteropServices;` 2. 使用`DllImport`...
DLL(动态链接库)是共享代码的一种方式,多个应用程序可以引用同一个DLL,以减少内存占用和提高代码重用。本示例将深入讲解C#中DLL的开发和调用过程。 首先,我们来了解如何创建一个C# DLL: 1. **创建DLL项目**...
### C#中如何调用动态链接库DLL #### 动态链接库DLL简介 动态链接库(DLL)是Microsoft Windows操作系统的重要组成部分,它包含可被程序或其他DLL调用的函数,从而完成特定操作。DLL不包含可执行代码本身,不能独立...
为了满足不同系统的需求,本压缩包包含了7z-64.dll和7z-32.dll两个文件,分别对应64位和32位操作系统。在部署应用程序时,应根据目标操作系统的位数选择合适的版本,确保程序的正常运行。 总之,7z.dll是C#开发中...
可直接调用百度飞桨PaddleOCR文字识别模型,实现一次初始化后进行多次单张图片推理...而目前项目需要一次初始化后连续传单张图进行推理,所以我在模型原c++部署代码中进行修改,并生成动态库方便后续其他项目自由调用。
在C# WinForm应用开发中,有时为了保护代码或者实现某些特定功能,我们可能需要在程序运行时动态加载外部文件,比如DLL(动态链接库)文件。标题中的“C# WinForm 运行前释放令一个文件(或DLL)”指的就是这种技术。...
在给定的场景中,"SQL数据库调用C# dll库"是指在SQL Server 2008环境中,通过存储过程或者其他数据库编程方式,来调用由C#语言编译生成的动态链接库(dll)文件,以实现特定的功能扩展。下面我们将详细探讨这一技术...
动态链接库(Dynamic Link Library,简称DLL)是Windows操作系统中的一种共享库机制,它允许不同程序...通过`ClassLibrary1`的例子,我们可以看到生成和调用动态库的具体操作,这有助于我们在实际开发中应用这些概念。
### 使用C#调用DLL详解 #### 一、DLL与应用程序概述 动态链接库(Dynamic Link Library,简称DLL)是Microsoft Windows系统的核心组成部分之一。在Windows系统的文件夹中,可以看到大量的DLL文件,这些文件实现了...
在C#编程中,有时我们需要将引用的DLL文件与主执行程序(EXE)整合在一起,以便在只发布单个可执行文件的情况下运行程序。这种技术通常用于减少部署的复杂性,防止因为丢失依赖库而导致的运行错误。下面将详细解释...
C#调用YOLOv3实现目标识别是一个在计算机视觉领域常见的应用场景,主要涉及C#编程、YOLO(You Only Look Once)模型以及DLL动态链接库的使用。YOLOv3是目标检测算法的一种,以其高效和准确而受到广泛关注。在C#中,...
这通常通过动态链接库(DLL)注入技术实现,可以避免因注册信息丢失或不兼容导致的问题,使得程序部署更加简单。 在压缩包中,`CDmSoft.cs`是一个C#源代码文件,它包含了调用大漠插件的类和方法。开发者可以通过这...