C ++ / CLI явно загружает управляемую DLL во время выполнения (эквивалент LoadLibrary для неуправляемых) - PullRequest
5 голосов
/ 23 июня 2010

Проблема 1:

Есть ли способ явно загрузить библиотеку во время выполнения, а не во время компиляции в C ++ / CLI.В настоящее время я использую .NET «Добавить ссылку» во время компиляции.Я хотел бы явно загрузить управляемую DLL.Есть ли .NET эквивалент LoadLibrary?

Обновление: Благодаря Randolpho

Assembly :: LoadFrom, пример из MSDN

Assembly^ SampleAssembly;
SampleAssembly = Assembly::LoadFrom( "c:\\Sample.Assembly.dll" );
// Obtain a reference to a method known to exist in assembly.
MethodInfo^ Method = SampleAssembly->GetTypes()[ 0 ]->GetMethod( "Method1" );
// Obtain a reference to the parameters collection of the MethodInfo instance.
array<ParameterInfo^>^ Params = Method->GetParameters();
// Display information about method parameters.
// Param = sParam1
//   Type = System::String
//   Position = 0
//   Optional=False
for each ( ParameterInfo^ Param in Params )
{
   Console::WriteLine( "Param= {0}", Param->Name );
   Console::WriteLine( "  Type= {0}", Param->ParameterType );
   Console::WriteLine( "  Position= {0}", Param->Position );
   Console::WriteLine( "  Optional= {0}", Param->IsOptional );
}

Проблема 2:

Если Assembly :: LoadFrom является .NET-эквивалентом LoadLibrary.Что эквивалентно GetProcAddress?Как мне создать FunctionPointers для методов?

Обновление: MethodBase.Invoke от MSDN

using namespace System;
using namespace System::Reflection;

public ref class MagicClass
{
private:
    int magicBaseValue;

public:
    MagicClass()
    {
        magicBaseValue = 9;
    }

    int ItsMagic(int preMagic)
    {
        return preMagic * magicBaseValue;
    }
};

public ref class TestMethodInfo
{
public:
    static void Main()
    {
        // Get the constructor and create an instance of MagicClass

        Type^ magicType = Type::GetType("MagicClass");
        ConstructorInfo^ magicConstructor = magicType->GetConstructor(Type::EmptyTypes);
        Object^ magicClassObject = magicConstructor->Invoke(gcnew array<Object^>(0));

        // Get the ItsMagic method and invoke with a parameter value of 100

        MethodInfo^ magicMethod = magicType->GetMethod("ItsMagic");
        Object^ magicValue = magicMethod->Invoke(magicClassObject, gcnew array<Object^>(1){100});

        Console::WriteLine("MethodInfo.Invoke() Example\n");
        Console::WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue);
    }
};

int main()
{
    TestMethodInfo::Main();
}

Ответы [ 2 ]

1 голос
/ 23 июня 2010

Вы сказали управляемая DLL?Тогда вы хотите Assembly::Load

0 голосов
/ 23 июня 2010

Проверьте http://www.informit.com/articles/article.aspx?p=25948 для получения информации о Reflection. Это может быть билет, который вы ищете (не зная больше о проблеме, трудно сказать)

В нем есть целый раздел, посвященный динамической загрузке сборок и проверке их, чтобы выяснить методы и свойства и еще много чего.

...