Вызвать код C ++ / CLI из C # - PullRequest
2 голосов
/ 16 июня 2011

Есть два проекта (C # и Managed C ++). Проекты C # должны вызывать метод в проекте ManagedCPP. в справочном разделе проекта c # добавлен управляемый cpp dll.

если строки 1, 2 и 3 не закомментированы, а строка 4 закомментирована, возникает также следующая проблема:

Необработанное исключение: System.BadImageFormatException

Кодовая база выглядит следующим образом:

C# class:

using System.Runtime.InteropServices;
using ManagedCPP;

namespace CSharp
{
class Program
{
    //[DllImport("ManagedCPP")]                   // Line 1
    //public static extern void Convert();        // Line 2

    static void Main(string[] args)
    {
        new Program().CreateObject();
    }

    private void CreateObject()
    {
        //Convert();                              // Line 3
        ManagedCPPEntryClass c = new ManagedCPPEntryClass();  // Line 4

        Console.ReadKey();
    }
}
}

C++/CLI class(.h):

namespace ManagedCPP 
{
public ref class ManagedCPPEntryClass
{
    public:
        void Convert();
};
}

C++/CLI class(.cpp):

#include "ManagedCPP.h"
using namespace ManagedCPP;

void ManagedCPPEntryClass::Convert()
{
}

Ответы [ 3 ]

4 голосов
/ 16 июня 2011

Убедитесь, что ваш собственный код (C ++) скомпилирован в том же формате (32 бита или 64 бита), что и формат выполнения .Net вашего приложения C # (снова 32 бита или 64 бита). Это может быть причиной вашей проблемы.

. По умолчанию .Net запускается в том же формате, что и ОС. Вы можете принудительно выполнить выполнение в выбранном формате, установив параметр компиляции в Visual Studio.

1 голос
/ 16 июня 2011

Комментированные строки используются для вызова неповрежденного API Convert из неуправляемого Dll IPF_ManagedCPP.На самом деле, IPF_ManagedCPP - это управляемый Dll, а Convert - это метод управляемого класса.Конечно, это не может работать.

Библиотека классов C ++ / CLI должна использоваться клиентским кодом .NET точно так же, как любая другая библиотека классов.Неуправляемый Dll может использоваться в проекте .NET двумя способами: с помощью PInvoke или с помощью оболочки C ++ / CLI.Вам не нужен PInvoke для библиотеки IPF_ManagedCPP.

1 голос
/ 16 июня 2011

Я не специалист по данной теме, но вы должны использовать DllImport для доступа к сборке, не относящейся к CLI, в то время как CLI можно напрямую использовать в C #, как если бы это была собственная сборка (преимущество использования общего интерфейса).

...