首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++-CLI ( .dlls )应用程序中延迟加载.dlls?

如何在C++-CLI ( .dlls )应用程序中延迟加载.dlls?
EN

Stack Overflow用户
提问于 2011-01-21 12:16:03
回答 1查看 2.9K关注 0票数 5

我试图延迟为C++/CLI应用程序加载依赖的.dlls,以便能够测试它们的存在并警告用户而不是崩溃。

我尝试将dlls添加到MyProject->Properties->ConfigurationProperties->Linker->Input->Delay加载的DLLS ...but中,这给了我一个警告,即它没有引用它们:

5>LINK :警告LNK4199: /DELAYLOAD:Util.dll被忽略;没有从Util.dll找到导入

如果我删除一个.dll并运行应用程序,它就会崩溃,并希望向微软发送有关缺少的.dll的信息,因此看起来它仍然在尝试在启动时加载所有模块,并因此得到了满足。

FYI,我的应用程序初创公司看起来是这样的:

代码语言:javascript
复制
using namespace System;
using namespace System::Collections::ObjectModel;
using namespace Microsoft::Win32;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    try
    {
        // Enabling Windows XP visual effects before any controls are created
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        // First make sure we have all the .dlls we need
        ArrayList^ missingDlls = gcnew ArrayList();
        Assembly^ assembly = Assembly::GetEntryAssembly();
        array<System::Reflection::AssemblyName^>^ referencedAssemblies = assembly->GetReferencedAssemblies();
        for each(System::Reflection::AssemblyName^ referencedAssemblyName in referencedAssemblies)
        {
            try
            {
                Assembly^ a = assembly->Load(referencedAssemblyName);
                if( a == nullptr )
                {
                    missingDlls->Add(referencedAssemblyName->Name);
                }
            }
            catch(System::Exception^ e)
            {
                MessageBox::Show("Error loading "+referencedAssemblyName->Name);
            }
        }

        ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-21 15:45:09

链接器的/delayload选项仅适用于包含编译为本机代码的函数的DLL。链接器已经告诉你你没有。

这里可能出现的情况是,DLL实际上包含IL,而不是机器代码。这将发生在您使用/clr编译源代码并且还没有使用#杂注设法关闭IL生成时。需要通过抖动将IL代码转换为机器代码。

只要抖动需要程序集元数据中的类型信息来生成机器代码,DLL就会被动态加载,就像/delayload一样。为了避免对DLL的依赖,您必须精心设计代码,这样抖动就不需要从程序集加载类型。这与避免执行延迟加载函数是一个不同的问题。异常的InnerException的堆栈跟踪应该会给您一个强烈的提示,说明这是如何发生的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4758674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档