gpt4 book ai didi

c# - 制作 C++/MFC 应用程序以从其他应用程序中提取 AssemblyInfo?

转载 作者:行者123 更新时间:2023-11-30 04:34:53 25 4
gpt4 key购买 nike

我正在尝试制作一个 C++/MFC 应用程序(所谓的“更新应用程序”),它可以从其他用 C#/.NET 3.5 编写的应用程序中提取 AssemblyVersion 信息。
所以我可以根据我可以获得的版本信息来更新我的 C# 程序。

我很确定这是可能的,但我不知道哪种方式最好。

我想知道一些可以在网络上搜索的技术或关键字。

直接解释也将不胜感激。

最佳答案

下面大致介绍了我们如何在原生 C++ 应用中执行类似的操作。

/clr 编译.您可以在整个项目范围内或仅在选定的 C++ 文件上执行此操作,但据我所知,有选择地执行此操作很复杂,因此我们只是在整个项目范围内执行此操作。还有 #include <vcclr.h>在适当的时候。

您需要了解应用域。这里最主要的是,一旦将程序集加载到域中,就无法卸载程序集,除非卸载整个域。由于您想要加载一个程序集,查询其版本,然后放手,您可能想要创建一个临时域并加载到其中。

在我们的系统中,我们有一个名为 ModelLoader 的托管 C++ 类来加载对象模型、查询它们的版本信息并丢弃它们 - 就像您想要做的那样。此类是我们托管/非托管编码(marshal)处理中的关键元素。

ModelLoader 中的代码必须在临时域中执行,因为我们希望它在那里加载目标程序集然后卸载域但是,主应用程序已经在主域中运行,因此它需要能够将方法调用编码到临时域中的 ModelLoader。所以ModelLoader继承System::MarshalByRefObject ,它允许 .NET 运行时执行所有编码魔术。

所以基本步骤是这样的:

  1. 加载包含 ModelLoader 代码的程序集。在我们的系统中,它内置于我们的主要非托管 .EXE 中,因此我们只需使用 Reflection::Assembly::GetExecutingAssembly() 来获取它的句柄。如果你的 ModelLoader 等价物在一个单独的程序集中,那么你将不得不以某种方式加载它。但由于您可能不需要卸载此程序集,您可以将其加载到主域中。

  2. 创建一个临时域。

  3. 在临时域中创建您的 ModelLoader 类的实例(显然它在您的系统中将具有不同的名称)。

  4. 将该新实例的句柄编码回您的主域。

  5. 使用主域中的编码句柄在临时域中执行代码。

  6. 卸载临时域。

所以,在代码中:

AppDomain ^domain = AppDomain::CreateDomain(L"temp domain");
Assembly ^assembly = Assembly::GetExecutingAssembly();
ObjectHandle ^handle = domain->CreateInstanceFrom(
assembly->Location,L"ModeLoader");
Object ^o = handle->Unwrap();
ModelLoader ^loader = dynamic_cast<ModelLoader^>(o);
loader->GetAssemblyVersion(...);
AppDomain::Unload(domain);

为了让您省去一些麻烦,涉及的命名空间是:

System::AppDomain
System::Reflection::Assembly
System::Runtime::Remoting::ObjectHandle
System::Object

在您的 ModelLoader 中,您需要加载目标程序集并查询其版本信息。与所有其他内容相比,这很简单:

void ModelLoader::GetAssemblyVersion(const wchar_t *filename, AssemblyName ^name)
{
Assembly ^assembly = Assembly::Load(gcnew String(filename));
name = assembly->GetName();
}

(这个函数是我刚才编的,所以可能不太对。)

另一件需要注意的事情是程序集分辨率。这就是程序集加载程序将程序集名称解析为 DLL 文件的方式。这本身就是一个很大的领域,所以我现在不再谈论它。 (无论如何我都不是专家。)开始时,只需确保您要加载的所有程序集都在您的主应用程序目录中,我认为您或多或少会没问题。然后当您的基本加载工作正常时,您可以担心更复杂的解决方案。

关于c# - 制作 C++/MFC 应用程序以从其他应用程序中提取 AssemblyInfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5712222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com