在C#中,可以使用反射检索与程序集相关的信息,如产品名称,版本等:
string productName = Assembly.GetCallingAssembly().GetName().Name;
string versionString = Assembly.GetCallingAssembly().GetName().Version.ToString();
如果正在执行的程序集是用非托管C ++编写的(比如说),我该如何做等效的?它甚至可能吗?假设我有一个.NET dll,它是通过COM接口在非托管代码中调用的。
修改
为了使事情绝对清楚,这是我的情景:
可能的?
答案 0 :(得分:1)
没有必要走出堆栈来找出你所处的进程。你只需要进行一次Win32 API调用:
HMODULE hEXE = GetModuleHandle(NULL);
根据documentation for this call:
如果此参数为NULL,则GetModuleHandle返回用于创建调用进程(.exe文件)的文件的句柄。
您可以将此模块句柄转换为另一个标准Win32 API GetModuleFileName()的文件名。手头的文件名,然后可以调用GetFileVersionInfo()来检索该文件的VS_VERSIONINFO结构。你想要的信息就在那里。
现在,由于您使用的是.NET,因此可以使用P {Invoke签名GetModuleHandle(),GetModuleFileName()。对于GetFileVersionInfo(),您可以使用System.Diagnostics.FileVersionInfo。
但实际上最简单的方法就是坚持使用System.Diagnostics命名空间,你需要的一切都在那里。调用System.Diagnostics.Process.GetCurrentProcess()返回正在运行的进程的Process对象。然后,您可以从MainModule属性中检索ProcessModule。 ProcessModule有一个名为FileVersionInfo的属性。你想要的信息就在那里。
答案 1 :(得分:0)
您可以在VB.Net中使用以下代码来检索扩展文档属性:
Sub Main()
Dim arrHeaders(41)
Dim shell As New Shell32.Shell
Dim objFolder As Shell32.Folder
objFolder = shell.NameSpace("C:\tmp\")
For i = 0 To 40
arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
Next
For Each strFileName In objfolder.Items
For i = 0 To 40
Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objFolder.GetDetailsOf(strFileName, i))
Next
Next
End Sub
将Microsoft Shell控件和自动化的COM引用添加到要编译的项目中。
上述程序的输出将是分配给C:\ tmp中所有文件的元数据列表,例如
0 Name: dpvoice.dll
1 Size: 208 KB
2 Type: Application Extension
3 Date Modified: 14.04.2008 04:41
4 Date Created: 14.04.2008 04:41
5 Date Accessed: 01.12.2008 09:56
6 Attributes: A
7 Status: Online
8 Owner: Administrators
9 Author:
10 Title:
11 Subject:
12 Category:
13 Pages:
14 Comments:
15 Copyright:
16 Artist:
17 Album Title:
18 Year:
19 Track Number:
20 Genre:
21 Duration:
22 Bit Rate:
23 Protected:
24 Camera Model:
25 Date Picture Taken:
26 Dimensions:
27 :
28 :
29 Episode Name:
30 Program Description:
31 :
32 Audio sample size:
33 Audio sample rate:
34 Channels:
35 Company: Microsoft Corporation
36 Description: Microsoft DirectPlay Voice
37 File Version: 5.3.2600.5512
38 Product Name: Microsoftr Windowsr Operating System
39 Product Version: 5.03.2600.5512
40 Keywords:
答案 2 :(得分:0)
假设您正在查看@divo的调用返回的EXE / DLL的PE头数据,例如公司,产品等......这些顺便说一句。源自调用Win32版本信息API - 在MSDN上详细说明:
您面临的下一个挑战是枚举callstack以发现调用者的模块上下文。我没试过 - 但是如果你检查一下你自己的callstack,我怀疑你会看到那些非管理的来电者的帧被编组到那里。怀疑它在切换到CCW之前注入的过渡帧处停止。此外,因为它是COM,可以想象调用者可以从进程中调用 - 您的调用者将是一个代理进程。
如果失败 - 您需要调试API来展开外部堆栈 - 这会引入其他约束:
在逐个呼叫的基础上,其中任何一个都可能使调试器方法变得不切实际。
<强>更新强>
一些研究表明,即使在调试器中,在CCW过渡帧之上读取堆栈仍有很多错误和缺陷。例如
混合非托管/托管符号解析非常难看 - 关于如何做到的一些想法... DaveBr关于调试的博客也非常棒。
在非托管/托管客户端之间编组调用的步骤中有大量的素材 - 例如