C++ 如何加载VC++;MFC应用程序中的CLR库?
嗨,我有一个用VC++6.0开发的应用程序,现在我想使用.NET的一些新功能并开发一个库,要开发这个库,我必须使用CLR-VC++现在我把它打包在一个DLL中。现在我需要在我的MFC应用程序中调用这个DLL的例程 我试图编写一个小的MFC应用程序来加载这个DLL,每次LoadLibrary()调用都失败@err=126,找不到模块。我用dependency walker检查DLL,一切正常。请在这方面帮助我。 如果可能,请为我提供一个示例代码或链接。 提前谢谢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用于为要调用的对象创
-Sachin用于为要调用的对象创建COM可调用包装器。然后像使用任何其他COM类型一样使用它。用于为要调用的对象创建COM可调用包装器。然后使用它,就像其他任何COM类型。< /P> < P>我有一个本地C++应用程序,它使用托管C++程序集,并将它加载到LoopRealSub()中,没有问题。然而,在LoadLibrary()工作之前,我必须做两件事:
- 确保当前目录是托管程序集所在的目录(使用chdir()更改目录)
- 在托管程序集中,本机代码调用的第一个函数仅定义
事件的处理程序,该事件显式地从托管应用程序的文件夹加载程序集。然后,它调用另一个托管函数来完成其余的初始化AppDomain::CurrentDomain->AssemblyResolve
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
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地址在那里