gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:58:02 25 4
gpt4 key购买 nike

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

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

5>LINK : warning LNK4199: /DELAYLOAD:Util.dll ignored; no imports found from Util.dll



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

仅供引用,我的应用启动看起来像这样:
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 选项仅适用于包含编译为 native 代码的函数的 DLL。链接器已经告诉你你没有。

这里可能的情况是您的 DLL 实际上包含 IL,而不是机器代码。当您使用有效的/clr 编译源代码并且没有使用 #pragma 设法关闭 IL 生成时,会发生这种情况。 IL代码需要通过jitter转换成机器码。

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

关于.net - 如何在 C++-CLI (.net) 应用程序中延迟加载 .dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4758674/

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