C++ 如何加载VC++;MFC应用程序中的CLR库?

C++ 如何加载VC++;MFC应用程序中的CLR库?,c++,dll,mfc,visual-c++,C++,Dll,Mfc,Visual C++,嗨,我有一个用VC++6.0开发的应用程序,现在我想使用.NET的一些新功能并开发一个库,要开发这个库,我必须使用CLR-VC++现在我把它打包在一个DLL中。现在我需要在我的MFC应用程序中调用这个DLL的例程 我试图编写一个小的MFC应用程序来加载这个DLL,每次LoadLibrary()调用都失败@err=126,找不到模块。我用dependency walker检查DLL,一切正常。请在这方面帮助我。 如果可能,请为我提供一个示例代码或链接。 提前谢谢 -Sachin用于为要调用的对象创

嗨,我有一个用VC++6.0开发的应用程序,现在我想使用.NET的一些新功能并开发一个库,要开发这个库,我必须使用CLR-VC++现在我把它打包在一个DLL中。现在我需要在我的MFC应用程序中调用这个DLL的例程

我试图编写一个小的MFC应用程序来加载这个DLL,每次LoadLibrary()调用都失败@err=126,找不到模块。我用dependency walker检查DLL,一切正常。请在这方面帮助我。 如果可能,请为我提供一个示例代码或链接。 提前谢谢


-Sachin

用于为要调用的对象创建COM可调用包装器。然后像使用任何其他COM类型一样使用它。

用于为要调用的对象创建COM可调用包装器。然后使用它,就像其他任何COM类型。< /P> < P>我有一个本地C++应用程序,它使用托管C++程序集,并将它加载到LoopRealSub()中,没有问题。然而,在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();
}

我有一个本地C++应用程序,它使用托管C++程序集,并将它加载到LoopRealSub()中,没有问题。然而,在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();
}

您必须转到属性页->公共属性->添加新引用并包含您
CLR地址在那里。

您必须转到属性页->公共属性->添加新引用并包括您 CLR地址在那里