繁体   English   中英

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

[英]How do I delay loading .dlls in a C++-CLI (.net) application?

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

我已经尝试将dll添加到MyProject-> Properties-> ConfigurationProperties-> Linker-> Input-> Delay Loaded DLLS ...但是这只是给了我一个警告,它没有引用它们:

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

如果我删除.dll并运行应用程序它会崩溃,并希望向microsoft发送有关丢失的.dll的信息,因此它看起来仍然在尝试在启动时加载所有模块并因此适合。

仅供参考,我的app启动看起来像这样:

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);
            }
        }

        ...

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

这里可能的情况是你的DLL实际上包含IL,而不是机器代码。 当您使用/ clr编译源代码并且未使用#pragma managed来关闭IL生成时,会发生这种情况。 需要通过抖动将IL代码转换为机器代码。

一旦抖动需要来自程序集元数据的类型信息以生成机器代码,您的DLL将动态加载,与/ delayload相同。 为了避免对DLL的依赖,您必须仔细制作代码,以便抖动永远不需要从程序集中加载类型。 这与避免执行延迟加载功能的问题不同。 异常的InnerException的堆栈跟踪应该会给你一个强烈的提示,告诉你这是怎么回事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM