我认为其他回答并没有回答问题“stdole.dll
的作用”大部分内容。以下是我的理解。
概述:
这个DLL位于一个引用链的顶部,从您的托管应用程序最终引用到非托管操作系统DLL,它看起来像这样:
.NET app -->
stdole.dll -->
stdole2.tlb -->
oleaut32.dll
这个链中的链接很清晰,但却不太明显。本回答的其余部分将逐步解释这个链...
详细解释:
stdole.dll
本身是一个交互 DLL。这意味着它是一个 .NET 组件,其目的实质上是充当包装器,围绕具有 COM 接口的特定非托管类。如果您使用像 ILSpy 或 dotPeek 这样的工具查看 stdole.dll
,您可以看到其中的内容。以下是 StdPicture
接口的 示例:
using System.Runtime.InteropServices;
namespace stdole
{
[CoClass(typeof (StdPictureClass))]
[Guid("7BF80981-BF32-101A-8BBB-00AA00300CAB")]
[ComImport]
public interface StdPicture : Picture
{
}
}
这只是一个带有属性的接口,编码了应该使用的COM类的详细信息。像这样的DLL通常是使用类似tlbimp.exe
的工具自动创建的,或者当您将未管理的COM DLL直接作为引用添加到项目中时,Visual Studio会为您执行此操作。
我们可以深入了解一下。在上面的示例中,
Guid
(全局唯一标识符)
7BF80981-BF32-101A-8BBB-00AA00300CAB
通常会在 Windows 注册表中找到,这就是运行时从托管代码实际使用
stole.StdPicture
时要查找的地方。
如果您使用 RegEdit 搜索该 GUID,则会找到:
Computer\HKEY_CLASSES_ROOT\Interface\{7BF80981-BF32-101A-8BBB-00AA00300CAB}\TypeLib
该值为00020430-0000-0000-C000-000000000046
。
搜索该值,您将找到:
Computer\HKEY_CLASSES_ROOT\TypeLib\{00020430-0000-0000-C000-000000000046}
(同一DLL的大多数其他GUID可能会有类似的条目)。
实际上,此键具有许多有趣的细节,事实上是底层实现的几个版本的细节。例如,在子键 2.0\0\win32
下,默认值为:
C:\WINDOWS\SysWow64\stdole2.tlb
对于版本2的32位变体来说,这是更接近实际实现StdPicture
的一步。
一个TLB文件只是DLL的COM“头文件”。它本身没有可执行代码。在类似
OLEViewDotNet或原始
OleView这样的工具中打开
stdole2.tlb
,您可以阅读类型库的IDL。在这种情况下,第一部分包含以下内容:
[
uuid(00020430-0000-0000-C000-000000000046),
version(2.0),
helpstring("OLE Automation")
]
library stdole
{
...
}
请注意,
uuid
的值与我们在上面从 Regedit 中获取的值相同。向下滚动,我们最终会来到
StdPicture
条目,这与上面的示例相同:
[
uuid(0BE35204-8F91-11CE-9DE3-00AA004BB851)
]
coclass StdPicture {
...
};
再次提醒,这里没有真正的代码,只有一个类定义。回到RegEdit,我们可以找到
uuid
:
Computer\HKEY_CLASSES_ROOT\CLSID\{0BE35204-8F91-11CE-9DE3-00AA004BB851}\InprocServer32
其值为C:\Windows\System32\oleaut32.dll
,我们现在知道此DLL实现了32位stdole
库版本2的StdPicture
coclass。
(虽然我认为这个文件应该在SysWow64
中...?)
如果您要遵循某些其他接口的链,则可能会到达相同的DLL或另一个DLL。
请注意,对于某些语言(如VB6),将TLB嵌入实现DLL直接中是很典型的。但这不是COM所必需的,显然也不是Microsoft在此情况下的做法。