2011-06-17 5 views
5

私はCプログラムを持っており、DLLファイルを作成しました。私はWindows VistaとVisual C++を使用しています。C#プログラムのDLLからメソッドにアクセスする

これで、C#コードのMain()メソッドからそのDLLからメソッドにアクセスする必要があります。そうするステップは何ですか?

これまでDLLファイルを参照として追加しましたが、その後はどうすればよいですか?

これが唯一の例である:

int main1(void) { 
    prinf("Hello World"); 
} 

このクラスは、他の.lib機能を私たちになりますが、私は成功したそれからDLLを作成することができたことに注意してください。 (これが適切かどうかわからない)

私はこのメソッドにC#Main()からアクセスする必要があります。

[STAThread] 
static void Main() 
{ 
    // I need to call that main1() method here 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 
+0

ネイティブC DLLへの参照を追加することはできません。明らかに、本当のC DLL、おそらくC++/CLIを使用していません。この場合、特別なことは必要ありません。あなたが公開した "ref class"宣言は、C#プログラムで直接利用できます。 –

+0

はい、C++/CLIプロジェクトです。あなたの答えに基づいて、それは直接行うことができるようだ、 'ref class'と言って、あなたは私のCクラスを意味しますか?どのように公開するのですか? これまでの手順は、dllを参照として追加し、 'using detect.h 'というステートメントを追加し、C#、Main()メソッドのようにアクセスしようとしました。 'detect.the_method_i_need()'のように動作しませんでした。 – illep

答えて

5

は偉大な受け入れ答えを持っているusing a class defined in a c++ dll in c# codeを参照してください。また、Hans Passantがコメントに書いたように、ネイティブDLLをC#プロジェクトへの参照として追加することはできません。

自分のネイティブDLLの1つを参照すると、通常、C#プロジェクトとネイティブDLLを生成するプロジェクトの間に依存関係を追加するか、DLLをC#プロジェクトのリンクされたコンテンツファイルとして追加しますso:

  1. プロジェクトを右クリックし、[追加]> [既存のアイテム]を選択します。
  2. 目的のDLLを参照して選択しますが、クリックしないでください。を追加します。
  3. の右側にある小さな矢印をクリックしてボタンを追加し、を追加リンクとして追加を選択します。
  4. C#プロジェクトに表示されるDLLを選択し、そのプロパティに移動します。
  5. ビルドアクションに設定されていることを確認してください。内容

これは、C#プロジェクトのbin\DebugフォルダにDLLをコピーして、あなたは一度、セットアッププロジェクトを作成することにした場合、あなたは簡単にすべてのコンテンツファイルを参照し、Microsoftインストーラに含めることができることを確認しますパッケージ。

ネイティブDLLで記述された関数を表示するには、それらをエクスポートする必要があります(Exporting C Functions for Use in C or C++ Language ExecutablesおよびExporting from a DLL Using __declspec(dllexport)を参照)。したがって、関数宣言の周りにextern "C"ブロックを追加する必要があります(コードをに書き込んだと仮定しています)。CPPソースファイルを、これはあなたがextern "C"であるとして、それらを宣言しない場合、コンパイラは)マングルされた関数名を放出することを意味します

extern "C" 
{ 
    __declspec (dllexport) void __cdecl Foo(const char* arg1); 
} 

... 

void Foo(const char* arg1) 
{ 
    printf ("Hello %s !", arg1); 
} 

__declspec (dllexport)装飾は、コンパイラ/リンカが機能をしなければならないことを意味しますDLLの外部から見ることができます。また、__cdeclは、パラメータがどのように関数に渡されるかを定義します(これを行うための標準的な "C"方法)。あなたはDLLのエクスポート方法を参照する必要がありますあなたのC#コードで

、:

class Program 
{ 
    [DllImport("mydll.dll")] 
    internal static extern void Foo(string arg1); 

    static void Main() 
    { 
     Program.Foo ("Pierre"); 
    } 
} 

あなたはすべての血みどろの詳細を示しPlatform Invoke Tutorialをお読みください。

+0

こんにちは@Pierre、私はあなたの手順に従って、私はどのように設定するかわからない**コンテンツ** **ビルドアクション**、私は、コードをコンパイルするとき、私は私のDLLのコピーを私のC#プロジェクトの_bin \ Debug_あなたが私をここで助けてくれることを願っています。私のC#プロジェクトのMain()メソッドから追加したそのDLLのメソッドにアクセスする方法を教えてください。 – illep

+1

@illep:C#プロジェクトのDLLファイルをクリックし、F4キーを押します。プロパティツールウィンドウでは、最初の行に「ビルドアクション」というラベルが付きます。その右側をクリックし、「コンテンツ」を選択します。 "Copy to Output Directory"がコピーオプションの1つに設定されていることを確認してください。 –

+0

@illep:あなたの投稿を編集し、アクセスしたいCコードのサンプルを追加してください。 C関数がDLLエクスポートディレクティブで適切に装飾されていることを確認する必要があります。 –

0

あなたはPlatform Invoke[DllImport]属性を探しています。

+0

私は次/ N '[DLLIMPORT( "detect.dll")]でした 内部の静的にextern int型のMAIN1()HELP;' を、 'detect.dll'は私が作成した私のDLLの名前です。 main1()は私のC#コードから実行しようとしているメソッドです。さて、私のC#コードから、私はmain1()を呼び出しました。メソッドと私は** DLL例外**が見つかりませんエラーが発生しますが、DLLは_bin \ Debug_フォルダーにあります。どのように私はこれを解決するのですか? 注:これは私のDLLを追加し、プロジェクトをR-Clickし、Reference-> select DLLを追加する方法です – illep

0

あなたが/ Pをよく読んで別名のPInvoke別名 "プラットフォーム呼び出し" を起動する必要があります。

http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx

+0

はい、私はいくつかのチュートリアルを行ってきましたが、何が** public static extern ** 手段。私はVisual C++を使って書かれた私のCコードを編集できません。とにかく私はDLLファイルとしてコードを持っています。例えば次のコードセグメントを考えてみてください。 'void main(){ printf(" HELLO WORLD "); } ' 上記は私のCコードであり、現在はDLLです。私はどのように私のC#Main()メソッドからmain()にアクセスしますか?私は基本的に(私のCコードの)main()にあるものを実行したい。 ヘルプ! – illep

+0

@illep:DLLを変更できない場合は、運が悪いです。外部からアクセスできるように関数をエクスポートする必要があります。あなたのDLLが( 'main'関数を使って)偽装されたEXEであれば、' System.Diagnostics.Process.Start'を使ってそのDLLを実行できます。 –

+0

@Pierreはい、私はそれを試みましたが、私はコンソールを開けたくありません。これを避けるためにとにかくありますか? – illep

関連する問題