Как загрузить библиотеку VC ++ CLR в приложение MFC? - PullRequest
1 голос
/ 16 сентября 2009

HI У меня есть приложение, разработанное на VC ++ 6.0, теперь я хочу использовать некоторые новые функции из .NET и разработал библиотеку, для разработки этой библиотеки мне нужно использовать CLR-VC ++, теперь я упаковал это в DLL. Теперь мне нужно вызвать подпрограмму этой DLL в моем приложении MFC.

Я пытался написать небольшое приложение MFC для загрузки этой DLL. Все время происходит сбой вызова LoadLibrary () @err = 126, модуль не найден. Я проверяю, что dll с обходчиком зависимостей всегда в порядке. Пожалуйста, помогите мне в этом отношении. Если возможно, предоставьте мне пример кода или ссылку. Заранее спасибо

-Sachin

Ответы [ 3 ]

1 голос
/ 14 сентября 2010

Вы должны перейти на страницу свойств -> Общие свойства -> Добавить новую ссылку и включить вас Адрес CLR там.

1 голос
/ 16 сентября 2009

Используйте ClrCreateManagedInstance для создания COM-Callable-Wrapper для объекта, который вы хотите вызвать. Затем используйте его как любой другой тип COM.

0 голосов
/ 16 сентября 2009

У меня есть родное приложение C ++, которое использует управляемую сборку C ++ и загружает ее с помощью LoadLibrary () без проблем. Однако мне пришлось сделать две вещи, прежде чем LoadLibrary () сработал:

  • Убедитесь, что в текущем каталоге находится управляемая сборка (используйте chdir () для изменения каталога)
  • В управляемой сборке первая функция, вызываемая собственным кодом, определяет только обработчик для события AppDomain::CurrentDomain->AssemblyResolve, которое явно загружает сборки из папки управляемого приложения. Затем он вызывает другую управляемую функцию для выполнения остальной части инициализации.

Причина последнего пункта заключается в том, что CLR пытается загрузить зависимость сборки, только если функция использует ее. Поэтому я должен был убедиться, что на типы в несистемных сборках не ссылаются до определения обработчика AssemblyResolve.

ref class AssemblyResolver
{
public:
    /// The path where the assemblies are searched
    property String^ Path
    {
        String^ get()
        { return path_; }
    }

    explicit AssemblyResolver(String^ path)
        : path_(path)
    { /* Void */ }

    Assembly^ ResolveHandler(Object^ sender, ResolveEventArgs^ args)    
    {
        // The name passed here contains other information as well
        String^ dll_name = args->Name->Substring(0, args->Name->IndexOf(','));
        String^ path = System::IO::Path::Combine(path_, dll_name+".dll");

        if ( File::Exists(path) )
            return Assembly::LoadFile(path);

        return nullptr;
    }

private:
    String^ path_;
};

extern "C" __declspec(dllexport) void Initialize()
{
    String^ path = "The path where the managed code resides";

    AssemblyResolver^ resolver = gcnew AssemblyResolver(path);
    AppDomain::CurrentDomain->AssemblyResolve += gcnew ResolveEventHandler(
        resolver, 
        &AssemblyResolver::ResolveHandler
    );

    FunctionWhichUsesOtherManagedTypes();
}
...