我是Visual Studio 2010的新手,
我有用C#编写的DLL,它正在使用VB.NET,现在我想用VC ++,你能帮助我吗?
答案 0 :(得分:2)
如果您计划在VC ++项目中使用.NET扩展,则只需在VC ++项目中添加对C#DLL的引用。
如果您计划使用纯C ++,则需要将C#DLL更改为COM-Visible,并生成将在C ++项目中导入的类型库。
答案 1 :(得分:1)
您可以使用PInvoke从.NET访问本机DLL(用C ++编写)中的函数。要从本机代码使用托管DLL(例如,从C ++代码调用C#方法),您必须将托管代码包装在COM组件中并使用来自C ++的COM对象
答案 2 :(得分:0)
使用P / invoke可以轻松实现另一种方式。从非托管中调用托管代码非常棘手。一个很好的选择是COM,但还有另一种选择。 Robert Giesecke发布了一个excellent project,允许您将托管方法公开为非托管DLL导出。
使用起来非常简单。您只需下载Visual Studio模板,基于该模板创建项目,添加代码,并使用DllExport
属性标记导出。
答案 3 :(得分:0)
或者您可以创建Manager C ++ DLL,它将引用和实现C#DLL中的所有或自定义对象。 之后,您可以在MCPP DLL中创建dllexport方法。 然后,您可以使用LoadLibrary(...)/ GetProcAddress(...)方法通过MCPP DLL访问C#DLL。 例如:
using namespace System; using namespace System::Windows::Forms; __declspec(dllexport) LPVOID GetPluginInterface() { return (IWithExecuteCommandMethod*)&theApp; } bool CClass::ExecuteCommand() { if(Threading::Thread::CurrentThread->TrySetApartmentState(System::Threading::ApartmentState::STA)) { Flatbed::SomeDialog ^pDialog=gcnew Flatbed::SomeDialog(); pDialog->ShowDialog(); } else { Threading::Thread ^pDialog=gcnew Threading::Thread(gcnew Threading::ThreadStart(ThreadProc)); pDialog->SetApartmentState(Threading::ApartmentState::STA); pDialog->Start(); } return false; }