使用VC ++导入C#DLL

时间:2011-12-09 14:19:46

标签: c# visual-c++ dll

我是Visual Studio 2010的新手,

我有用C#编写的DLL,它正在使用VB.NET,现在我想用VC ++,你能帮助我吗?

4 个答案:

答案 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;
    }