2016-11-09 6 views
5

私は2つの言語間の非常に基本的な相互運用を試みています。私は基本的にC++で処理したいと思うパフォーマンス集約的なコードを持っていて、その結果を自分のアプリケーションに戻します。C#とC++の相互運用方法

すべてはVisual Studioでコンパイルされます。

マーシャルはちょっと怪しいかもしれないし、本当に私が扱っているものではないので、私はを入力と出力のタイプに選んだ。

C++、私が持っている:私が持っている

#include "stdafx.h" // default from vs2013, no idea what it is 

_declspec(dllexport) int Diu(int p) { 
    return p * 2; 
} 

のC#:

using System; 

namespace Interop { 
    public class Program{ 
     [System.Runtime.InteropServices.DllImport("Hardworker.dll")] 
     public static extern int Diu(int p); 

     private static void Main(string[] args) { 
      Console.WriteLine(Diu(2)); 
     } 
    } 
} 

だから、かなり基本的な例です。しかし、私は例外を得ています:

An unhandled exception of type 'System.BadImageFormatException' occurred in Interop.exe

Additional information: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

C++プロジェクトは、作成ダイアログでコンソールアプリケーション> Dllとして作成されます。 逆アセンブラでC++のDLLをチェックしたところ、Diuがエクスポートされたシンボルとして表示されます。

Uh。私はinteropの設定について迷っていましたか?

答えて

4

このエラーが発生した場合:HRESULT: 0x8007000Bは、paltformの非互換性のために発生します。
コンパイラプロファイルが同じプラットフォーム(x86x64またはAnyCPU)に設定されていることを確認します。

+0

ニース。私のコンピュータはx64です。私はx86にコンパイルを設定しました。そして、エラーがEntryPointNotFoundExceptionに変更されました:DLL 'Hardwork.dll'で 'Diu'というエントリポイントを見つけることができません。 – CyberFox

+1

@Cyber​​Fox C++は、パラメータの型や関数のその他の修飾子に基づいて関数名をマングルします。 manglingせずに名前をつけてエクスポートするには、関数 'extern" C "'を宣言する必要があります。 –

+0

@YngveHammesrland実際に働いた。 1で2つの答え。 – CyberFox

関連する問題