2011-07-26 16 views
0

C#プログラムで使用されるC++で作成されたDLLがあります。 C#プログラムはDLLを参照し、クラスを呼び出し、DLLで定義されている関数を使用できます。C#でのDLL関数の使用についての質問

今私はC#でC++コードを実行できるように、DLLに他の関数を追加したいと思います。私は、DLLの他の関数がどのように定義されているかの例に従っています。 .hと.cppと私はコードを実行する新しい関数を作成します。以前定義した関数と同じ場所に置いていましたが、C#コードにDLLを置くと関数が存在しません。 DLLクラスのインスタンスを作成するとき、私の関数はその一部ではありません。

クラスのパブリック関数として.hを入れ、.cppで実行するコードを与えましたが、そのコードは見つかりませんでした。

なぜ私のC#プログラムは、他の関数と同じスイートを使っていても、私が作った関数を見ることができないのですか?

UPDATE

code.h:

#pragma once 

#include <windows.h> 
#include <PvDisplayWnd.h> 
#include <vfw.h> 
#include "NPvResult.h" 
#include "NPvDeviceInfo.h" 
#include "NPvBuffer.h" 
#include <string> 

using namespace System; 
using namespace System::Runtime::InteropServices; 

public ref class NPvDisplayWnd 
{ 
public : 
    NPvDisplayWnd(); 
    bool Handle(); 
    NPvResult^ ShowModeless(long locx, long locy, long x, long y); 
    NPvResult^ ShowModal(); 
    NPvResult^ NPvDisplayWnd::Create(); 
    int^ Display(NPvBuffer^ aBuffer, int^ x); 
    NPvResult^ Work(const std::string afilename, unsigned short asizex, unsigned short asizey, unsigned short aBPP, double aFPS); 
    NPvResult^ Close(); 
    NPvResult^ DoEvents(); 
} 

code.cpp:

#include "NPvDisplayWnd.h" 

NPvDisplayWnd::NPvDisplayWnd(){code} 
NPvResult^ NPvDisplayWnd::Create(){code} 
bool NPvDisplayWnd::Handle() 
NPvResult^ NPvDisplayWnd::ShowModeless(long locx, long locy, long x, long y){code} 
NPvResult^ NPvDisplayWnd::ShowModal(){code} 
int^ NPvDisplayWnd::Display(NPvBuffer^ aBuffer, int^ x){code} 
NPvResult^ NPvDisplayWnd::DoEvents(){code} 
NPvResult^ NPvDisplayWnd::Work(const std::string aFileName, unsigned short aSizeX, unsigned short aSizeY, unsigned short aBPP, double aFPS){code} 
NPvResult^ NPvDisplayWnd::Close(){code} 

私は仕事()関数を添加した関数。私はこれを構築し、私のC#のコードに配置する場合、それは仕事以外のすべての機能を見ています。私は正しい.dllを使用していたことを確認するために、私はShowModeless()の名前をShowModeless__F()に変更し、それを再構築してC#に追加し、変更を持ち越したが、私はまだWork()関数。

+0

作業しているサンプルへのリンクがありますか? – MusiGenesis

+0

これはC++のDLLではありません。これはC++/CLIです。これはC++とは別の言語です(ただし同様です)。 –

答えて

0

Windowsでは、ユーザーがDLLを使用してシンボルにアクセスできるように、シンボルを明示的にエクスポートする必要があります。これは、__declspec(export)構文を使用して行われます。これは、DLLのコンパイルとリンク時に必要です。


通常のC++の代わりにC++/CLIを使用していることがわかったので、問題があります。 Workstd::stringです。しかしWorkは管理された機能を意図しており、マネージコードはstd::stringをパラメータとして使用することはできません。代わりに管理された文字列型を使用する必要があります。

+0

私の追加機能なしでDLLが正常に動作します。私はさらに、.hと.cppで名前を変更し、それを私のC#アプリケーションに渡した機能を選択し、変更を見た。この同じ関数は.hと.cppでのみ参照されます。私はこの追加された機能のための同じセットアップに従ったし、それは仕事をしなかった – Grant

+0

@グラント:あなたが思っているDLLをロードしていないという良いチャンスがあります。DLLをビルドした後、パスに入り、古いDLLを上書きするか、またはDLLを上書きすることを確認する必要があります。それが問題でない場合は、コードを示す必要があります。関数用のC++ .hと.cppコード(それらは動作するものとそうでないもの)、およびそれらをロードするために使用するC#コード。 –

+0

がコードで更新されました。私はちょうど私のC#のコードでそれを参照し、DLLクラスをインスタンス化 – Grant

0

ネイティブC++クラスはC#でインポートできません。管理対象クライアント(C#など)がクラスをインポートできるように、既存のC++ DLLでC++/CLI機能を利用する必要があります。

namespace XX 
{ 
    public ref class YourClass{...}; 
} 

それはXX名前空間の下にマネージクラスYourClassをエクスポートします。 /CLRコンパイラフラグを使用する必要があります。

CPPファイルのセットを管理対象としてコンパイルし、その他のファイルセットをアンマネージとしてコンパイルできます。管理されたクラスには、(宣言されたポインタがない限り)管理されていないものを含むことはできません。

+0

がコードで更新されました – Grant

関連する問題