C#中,能够检索会有关的信息产品的名称,版本等等使用反思:

string productName = Assembly.GetCallingAssembly().GetName().Name;
string versionString = Assembly.GetCallingAssembly().GetName().Version.ToString();

我该怎么做的等效果的执行会写在不受管理C++(说)?它甚至有可能吗?假设我有一个.净dll其是在援用不受管理的代码,通过一个COM接口。

编辑:
为了让事情绝对清楚,这是我的方案:

  • 我有一个可执行的编写 不受管理C++
  • 我有一个dll写 在C#/.净
  • Dll调用 可执行的通过COM口
  • 内。净dll我想要的 能够检索信息像 产品的名称以及版本 呼吁可执行的。

可能吗?

有帮助吗?

解决方案

走这堆是没有必要找出什么样的过程。你只是使一个单一的Win32API呼吁:

HMODULE hEXE = GetModuleHandle(NULL);

根据 文件对这个呼叫:

如果这个参数的空,GetModuleHandle返回处理的文件用于创建的呼吁程(.exe文件)。

你可以把这一模块处理成文件名 GetModuleFileName(), 另一标准Win32API。文件名称中手,然后你可以叫 GetFileVersionInfo() 检索VS_VERSIONINFO结构的该文件。你想要的信息是在那里。

现在因为你是在。净你可以使用的P/调用的签名 GetModuleHandle(), GetModuleFileName().为GetFileVersionInfo()可以使用 系统。诊断。FileVersionInfo.

但实际上最简单的方法来做到这可能是坚持使用该系统。诊断的名字空间,你需要的一切是存在的。呼叫 系统。诊断。过程。GetCurrentProcess() 返回进程的对象的过程中,你正在运行中。然后你可以检索一个ProcessModule从 MainModule 财产。ProcessModule有一个所谓的酒店 FileVersionInfo.你想要的信息是存在的。

其他提示

你可以使用下列中的代码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

增加一个COM参考微软壳的控制和自动化项目编译。

输出的上述计划将是一个列表中的元数据分配到的所有文件C: mp 如

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:

让我们假设你后EXE/DLL的PE头的数据,@迪沃的呼吁的回报例如公司、产品等等。这些顺便说一句.是来自叫Win32Version信息API-细节上MSDN:

http://msdn.microsoft.com/en-us/library/ms646981.aspx

下一个挑战你面对的是列举的调用栈来发现你的呼叫者的模块上下文。我已经没有尝试过-但如果你检视自己的调用栈,我怀疑你会看到的不受管理的呼叫者的框架编组成。怀疑它停止在过渡框架注入前转换成《特定常规武器公约》.也因为它是COM,可以想象的呼叫者可以打电话给从出的过程-你的呼叫者将是一个代理进程。

如果失败-你需要调试API是来放松的外部叠,介绍了其他制约因素:

  • 升高的安全权限需要穿越堆
  • 潜在性能的影响展开堆。

在一个电话-电话的基础,这些能使调试器的做法不切实际的。

更新

一些研究表明,有大量的臭虫和陷阱,用于阅读的堆上述《特定常规武器公约》的过渡框架,甚至在调试器。例如

http://support.microsoft.com/kb/317221

混合不受管理/管理的符号决议是很丑陋的-有些想法在这里就如何做到这一点...DaveBr的博客上的是调试非常棒。

http://bytes.com/groups/net-vc/280340-stackwalk-callstack-symbol-resolve-managed-unmanaged-code-dbghelp-etc

http://blogs.msdn.com/davbr/archive/2005/10/06/478006.aspx

有充足的饲料说明采取了何种步骤调动电话之间的不受管理/管理客户-例如

http://msdn.microsoft.com/en-us/library/ms973872.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top