这里的高级问题:
我今天花了很多时间在基础高级概念上进行自我教育,例如API,静态和动态库,DLL和C#中的编组。获得所有这些知识使我看起来像一个非常基本的问题,并且可能在我对这些概念的理解中表现出一个漏洞:
我所知道的:
我得不到的东西:
我的印象是实际的方法是在DLL中定义的。当我给出的所有函数都是命名空间时,我的程序如何找到DLL中定义的实际函数?在顶部“使用XYZ.dll”而不是“使用XYZ_namespace”对我来说似乎更直观。
非常感谢帮助我填补这些空白。
编辑:修改后的帖子特定于C#。
编辑2:对于其他想知道他们的C#应用程序如何通过“使用namespaceX”实际获得类型的人来说,这是一个很好的资源(除了下面的有用帖子):{{ 3}}
基本上您要使用的类型驻留在库中,您必须将Visual Studio设置为引用这些库,以便在代码中“使用”其命名空间。
答案 0 :(得分:5)
在C#中,DLL(也称为程序集)包含class
es(和其他类型)。这些类型通常具有较长的全名,例如System.Collections.Generic.List<T>
。这些类型可以包含方法。
在References
区域中,您有对程序集的引用(这是.csproj文件的一部分)。在.cs文件中,您不需要包含任何using
来引用此DLL,因为它已在.csproj文件中引用。
如果包含using System.Collections.Generic;
之类的行,则会在您键入System.Collections.Generic.List<T>
时告诉C#编译器查找List<T>
。但是,您不需要这样做:只需键入System.Collections.Generic.List<T>
。
答案 1 :(得分:4)
DLL包含我们可能想要在我们中使用的许多例程/方法 程序
部分正确。 .Net
DLL包含Classes,这些类包含Members(字段,常量,方法,属性,事件,运算符,索引器)。
.Net严格来说是OOP,它不允许代码“浮动”。一切都在课堂内定义。
在Namespaces中组织类只是为了保持命名分离和组织。将名称空间视为包含一个或多个类的“文件夹”,可以在一个或多个程序集(DLL)中定义。
例如,System
命名空间中的类在2个程序集(DLL)中定义:mscorlib.dll
和System.dll
。
同时,这两个程序集包含许多不同的名称空间,因此您可以将Assembly to Namespace关系视为多对多。
当您在C#代码文件的开头放置using
指令时,您告诉编译器“我想使用此 Namespace
中定义的类, 无论他们来自哪个集会“。您将能够在当前项目中的所有程序集Referenced内使用此类命名空间中定义的所有类。
答案 2 :(得分:2)
我的印象是实际的方法是在。中定义的 DLL文件。我的程序如何找到定义的实际函数 在DLL中,当我给它们的全部是名称空间?
通过静态或动态绑定以及程序集binding进行查找正确代码的过程。编译代码时,静态绑定会告诉您是否编写了错误代码或忘记添加引用:
ClassInADifferentAssembly.M(); //通常这将是静态绑定和 如果您忘记包含引用,则会导致编译器错误
DifferentAssembly
除非您正在处理dynamic
或反射,否则您将拥有静态绑定。装配绑定是一个不同的过程。整个过程为complex,但基本上是在GAC,当前位置发现程序集,或者您甚至可以自己处理事件AppDomain.AssemblyLoad
。
因此,当您添加using statement
时,静态绑定可以在上下文中成功找到正确的代码。但是,如果稍后程序集无法在运行时绑定,则仍会收到运行时错误。
答案 3 :(得分:1)
DLL是动态链接库的缩写。并且可以是包含类,方法等的类库,它们都可以放在不同的名称空间下。
首先,您必须将DLL的引用添加到项目中。完成后,您可以使用诸如“using”之类的关键字来基本缩短到达该特定命名空间中的方法/类的路径。
示例名称空间
Namespace.Something.SomethingMore.Finally.Just.One.More
Namespace.Something.SomethingMore.Finally.Just.One.More2
要访问这些命名空间下的类,您可以执行以下任一操作
using Namespace.Something.SomethingMore.Finally.Just.One.More;
using Namespace.Something.SomethingMore.Finally.Just.One.More2;
// Now you can access classes under those namespaces without typing the whole namespace
// Like in the row below
Class.GetData();
如果您没有使用,您仍然可以访问这些类。但那么必须输入
Namespace.Something.SomethingMore.Finally.Just.One.More.Class.GetData();
Namespace.Something.SomethingMore.Finally.Just.One.More2.AnotherClass.GetData();
答案 4 :(得分:0)
DLL具有一系列功能。 您可以通过以下两种方式之一调用这些函数: 链接DLLs导出库(lib文件)或在运行时链接: 调用LoadLibrary() 调用GetProcAddress并提供所需函数的名称。您需要将其强制转换为实际类型(函数指针)。 通过新的函数指针调用该函数。 非常简单的东西,只需在MSDN上阅读。 C ++名称空间只是函数名称的一部分。 您可以使用名为Dependency Walker的工具查看从DLL导出的函数。