Estoy tratando de retrasar la carga de mis .dlls dependientes para una aplicación C++/CLI para que pueda probar su existencia y advertir al usuario en lugar de simplemente fallar.¿Cómo puedo retrasar la carga de .dlls en una aplicación C++ - CLI (.net)?
He intentado añadir los archivos DLL de MyProject-> Propiedades-> ConfigurationProperties-> Linker-> input-> DLLS retardo cargados ... pero eso me da una advertencia de que no se hace referencia a ellos:
5> LINK: advertencia LNK4199: /DELAYLOAD:Util.dll ignorado; no hay importaciones que se encuentran desde Util.dll
Si elimino un archivo .dll y ejecutar la aplicación se bloquea y desea enviar información a Microsoft sobre el .dll que faltan por lo que parece que todavía está tratando de cargar todos los módulos en inicio y tener un ataque como resultado.
FYI, mi aplicación de inicio se ve algo como esto:
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);
}
}
...
¿Qué significa "IL"? Sospechaba que esto probablemente iba a requerir más esfuerzo de lo que valía, y por lo que has dicho, probablemente sea así. –
Desafortunadamente, nunca tuve la oportunidad de detectar la excepción y desplegarla, así que todo lo que he visto son las partes externas del informe de errores que Miscrosoft quiere enviarse. –
IL == Idioma intermedio, a qué código se traduce cuando compila con/clr. La trepidación lo traduce en código de máquina. Suscríbase a AppDomain.CurrentDomain.UnhandledException para registrar excepciones no controladas como esta. Puede elevarse técnicamente antes de que su método Main() comience a funcionar si ese método usa tipos de dicho ensamblaje. –