标签: dll

什么是DLL?

这可能是一个非常noobie的问题,但在今天的Web应用程序开发世界中,许多程序员不需要处理dll,因此不必费心去了解他们的目的.

什么是dll?

  1. 它是干什么用的?
  2. 它是如何工作的?
  3. 你是如何创造一个的?
  4. 在什么情况下创建一个合适的?

我被告知dll用于存储函数库,但除此之外我不太了解.希望有人在这里可以启发我,所以我终于不知道我的Windows目录中的所有.dll文件是做什么的.

dll

85
推荐指数
4
解决办法
4万
查看次数

如何使用CMake将DLL文件复制到与可执行文件相同的文件夹中?

我们使用CMake在我们的SVN中生成源代码的Visual Studio文件.现在我的工具需要一些DLL文件与可执行文件位于同一文件夹中.DLL文件位于源旁边的文件夹中.

如何更改我CMakeLists.txt的生成的Visual Studio项目将在发布/调试文件夹中已经具有特定的DLL文件,或者在编译时将它们复制?

dll cmake

85
推荐指数
8
解决办法
5万
查看次数

为免注册COM生成清单文件

我有一些应用程序(一些本机,一些.NET)使用清单文件,以便它们可以完全隔离部署,而无需任何全局COM注册.例如,在myapp.exe.manifest文件中声明对dbgrid32.ocx com服务器的依赖关系如下,该文件与myapp.exe位于同一文件夹中:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="myapp.exe" version="1.2.3.4" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
    </dependentAssembly>
  </dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)

dbgrid32.ocx与它自己的dbgrid32.ocx.manifest文件一起部署到同一文件夹:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
  <file name="dbgrid32.ocx">
     <typelib
        tlbid="{00028C01-0000-0000-0000-000000000046}"
        version="1.0"
        helpdir=""/>
    <comClass progid="MSDBGrid.DBGrid"
       clsid="{00028C00-0000-0000-0000-000000000046}"
       description="DBGrid  Control" />
  </file>
</assembly>
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但手动维护这些清单文件有点痛苦.有没有办法自动生成这些文件?理想情况下,我只想声明应用程序对COM服务器列表(本机和.NET)的依赖性,然后自动生成其余部分.可能吗?

com dll manifest typelib regfreecom

84
推荐指数
4
解决办法
5万
查看次数

__declspec(dllimport)究竟是什么意思?

我看到了像这样的Qt源代码:

class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Run Code Online (Sandbox Code Playgroud)

哪个Q_CORE_EXPORT宏定义如下:

define Q_DECL_IMPORT __declspec(dllimport)
Run Code Online (Sandbox Code Playgroud)

__declspec(dllimport)真正意味着什么?

c++ dll qt visual-c++ declspec

82
推荐指数
3
解决办法
5万
查看次数

DLL中的内容是什么?

我总是在我的C#代码中引用DLL,但它们仍然有些神秘,我想澄清一下.这是关于DLL的问题的一种大脑转储.

我理解DLL是一个动态链接库,这意味着另一个程序可以在运行时访问该库以获得"功能".但是,请考虑以下ASP.NET项目Web.dllBusiness.dll(Web.dll是前端功能,它Business.dll是类型和方法的引用).

  1. 在什么时候Web.dll动态链接到Business.dll?在使用Word(等)时,你会注意到很多Windows硬盘驱动程序看似小的任务,我认为Word正在关闭并动态链接其他DLL的功能?

    1A.另外,什么加载和链接DLL - 操作系统或某些运行时框架,如.NET框架?

    1B.什么是"链接"的过程?是否进行兼容性检查?加载到同一个内存?链接实际意味着什么?

  2. 什么实际执行DLL中的代码?它是由处理器执行还是在处理器理解DLL中的代码之前还有另一个转换或编译阶段?

    2A.对于使用C#.NET构建的DLL,运行它的是什么:.NET框架或操作系统直接?

  3. Linux中的DLL是否可以在Windows系统上运行(如果存在这样的事情),或者它们是否特定于操作系统?

  4. DLL是否特定于特定框架?使用C#.NET构建的DLL是否可以由使用Borland C++构建的DLL使用?

    4A.如果4的答案是"否"那么DLL的重点是什么?为什么各种框架不使用自己的格式来链接文件?例如:.NET内置的.exe知道.abc的文件类型可以链接到其代码中.

  5. 让我们再回到Web.dll/ Business.dll例子-让客户的类类型我需要引用Business.dllWeb.dll.这必须意味着Business.dll包含某种关于客户类实际是什么的规范.如果我已经编译了我的Business.dll文件,比如Delphi:C#会理解它并且能够创建一个客户类,或者是否有某种标题信息或者说"嘿抱歉你只能从另一个Delphi DLL中使用我" ?

    5A.同样适用于方法; 我可以CreateInvoice()在DLL中编写一个方法,用C++编译它,然后从C#访问和运行它吗?什么阻止或允许我这样做?

  6. 关于DLL劫持的主题,当然,替换(坏)DLL必须包含确切的方法签名和类型作为被劫持的方法.我想如果你能找到原始DLL中可用的方法,那就不难做到.

    6A.在我的C#程序中决定我是否可以访问另一个DLL?如果我的被劫持的DLL包含与原始DLL完全相同的方法和类型但是它是用另一种语言编译的,它会起作用吗?

什么是DLL导入和DLL注册?

.net c# dll

78
推荐指数
3
解决办法
6万
查看次数

如何获取当前正在执行的DLL的位置?

我有一个配置文件,我需要加载作为我正在编写的DLL的执行的一部分.

我遇到的问题是,当应用程序运行时,我放置dll和配置文件的位置不是"当前位置".

例如,我把dll和xml文件放在这里:

D:\ Program Files\Microsoft Team Foundation Server 2010\Application Tier\Web Services\bin\Plugins

但是,如果我尝试像这样引用xml文件(在我的dll中):

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")
Run Code Online (Sandbox Code Playgroud)

然后.\ AggregatorItems.xml转换为:

C:\ WINDOWS\SYSTEM32\INETSRV\AggregatorItems.xml

所以,我需要找到一种方法(我希望)知道当前正在执行的dll所在的位置.基本上我正在寻找这个:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")
Run Code Online (Sandbox Code Playgroud)

.net c# dll file-io

78
推荐指数
4
解决办法
9万
查看次数

在同一解决方案中引用2个不同版本的log4net

我正在使用引用log4net 1.2.10.0的NHibernate 2.1.2.400.在同一个项目中,我也使用简单的会计SDK,遗憾的是它仍然使用log4net 1.2.9.0.

所以我可以让NHibernate工作,如果我引用log4net 1.2.10.0但是simpleSDK不起作用.反之亦然......

我猜大多数问题都来自于log4net已经改变了它的汇编密钥.我尝试使用绑定重定向但没有成功:2个DLL没有相同的密钥.

我正在考虑重新编译NHibernate以使用log4net 1.2.9.0,但这似乎是错误的做法,我的感觉是Simply Accounting不会更新他们的SDK以便很快使用log4net 1.2.10.0.

处理这个问题的最佳方法是什么?是否有可能解决?

.net nhibernate dll log4net

77
推荐指数
2
解决办法
3万
查看次数

从DLL动态加载函数

我正在查看.dll文件,我了解它们的用法,我正在尝试了解如何使用它们.

我创建了一个.dll文件,其中包含一个返回名为funci()的整数的函数

使用此代码,我(想)我已将.dll文件导入项目(没有投诉):

#include <windows.h>
#include <iostream>

int main() {
  HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\Documents and Settings\\User\\Desktop  \\fgfdg\\dgdg\\test.dll");

  if (hGetProcIDDLL == NULL) {
    std::cout << "cannot locate the .dll file" << std::endl;
  } else {
    std::cout << "it has been called" << std::endl;
    return -1;
  }

  int a = funci();

  return a;
}

# funci function 

int funci() {
  return 40;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译我认为已导入.dll的.cpp文件时,我遇到以下错误:

C:\Documents and Settings\User\Desktop\fgfdg\onemore.cpp||In function 'int main()':|
C:\Documents and Settings\User\Desktop\fgfdg\onemore.cpp|16|error: 'funci' was not     declared in this scope|
||=== Build …
Run Code Online (Sandbox Code Playgroud)

c++ dll winapi

77
推荐指数
2
解决办法
17万
查看次数

Windows上的__cdecl或__stdcall?

我目前正在开发一个Windows的C++库,它将作为DLL发布.我的目标是最大化二进制互操作性; 更确切地说,我的DLL中的函数必须可以从使用多个版本的MSVC++和MinGW编译的代码中使用,而无需重新编译DLL.但是,我对哪种调用约定是最好的cdecl或者很困惑stdcall.

有时我会听到诸如"C调用约定是唯一一个保证编译器相同的语句"的陈述,这与诸如" 解释中存在一些变化cdecl,特别是如何返回值 "之类的陈述形成对比.这似乎并没有阻止某些库开发人员(如libsndfile)在他们分发的DLL中使用C调用约定,而没有任何明显的问题.

另一方面,stdcall调用约定似乎是明确定义的.据我所知,所有Windows编译器基本上都需要遵循它,因为它是用于Win32和COM的约定.这是基于这样的假设:没有Win32/COM支持的Windows编译器不会非常有用.在论坛上发布的很多代码片段都声明了函数,stdcall但我似乎无法找到一个明确解释原因的帖子.

那里有太多相互矛盾的信息,我运行的每一次搜索都给出了不同的答案,这些答案并没有真正帮助我在两者之间作出决定.我正在寻找一个清晰,详细,有争议的解释,为什么我应该选择一个而不是另一个(或者为什么两者是等价的).

请注意,这个问题不仅适用于"经典"函数,还适用于虚拟成员函数调用,因为大多数客户端代码将通过"接口",纯虚拟类(以下描述的模式,例如此处那里)与我的DLL接口.

c++ windows dll calling-convention binary-compatibility

76
推荐指数
3
解决办法
5万
查看次数

在C#中运行时加载DLL

我试图找出如何在C#应用程序中运行时导入和使用.dll.使用Assembly.LoadFile()我设法让我的程序加载dll(这部分肯定是有效的,因为我能够获得带有ToString()的类的名称),但是我无法使用'输出'我的控制台应用程序内的方法.我正在编译.dll然后将其移动到我的控制台项目中.CreateInstance之间是否有额外的步骤,然后能够使用这些方法?

这是我的DLL中的类:

namespace DLL
{
    using System;

    public class Class1
    {
        public void Output(string s)
        {
            Console.WriteLine(s);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我想要加载DLL的应用程序

namespace ConsoleApplication1
{
    using System;
    using System.Reflection;

    class Program
    {
        static void Main(string[] args)
        {
            var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

            foreach(Type type in DLL.GetExportedTypes())
            {
                var c = Activator.CreateInstance(type);
                c.Output(@"Hello");
            }

            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# reflection dll

76
推荐指数
3
解决办法
18万
查看次数