C#からDLLの呼び出し方

このQ&Aのポイント
  • C#からDLLの呼び出し方法についての質問です。Visual Studio 2008 Express EditionとC# 3.5を使用しています。参考にしたページでは、C++からはMySub関数を呼び出すことができたようですが、C#から呼び出そうとするとエラーが発生してしまいます。具体的には、DllImport属性の記述の際にWINAPIが認識されていないというエラーが表示されます。どのように記述すればよいでしょうか。
  • C#とC++でDLLの呼び出し方が異なることに悩んでいます。Visual Studio 2008 Express EditionとC# 3.5を使用しています。参考にしたページでは、C++の場合はDLLを呼び出すためのヘッダーファイルが使用されていましたが、C#ではWINAPIが認識されていないというエラーが発生してしまいます。WINAPIの記述方法を教えていただきたいです。
  • C#からDLLを呼び出す際にWINAPIが認識されていないエラーが発生してしまいます。Visual Studio 2008 Express EditionとC# 3.5を使用しています。参考にしたページでは、C++の場合はヘッダーファイルを使用することで問題なくDLLを呼び出せたようですが、C#ではどのようにWINAPIを記述すればよいのでしょうか。具体的な方法を教えてください。
回答を見る
  • ベストアンサー

C#からDLLの呼び出し方

visual studio 2008 express edition C#3.5 を使用しています。 http://www.hata.cc/docs/wlinee/1.html を参考にC++からではMySub関数を呼び出すことができたのですが、 C#から呼び出そうと次のように記述したのですが、 [System.Runtime.InteropServices.DllImport("a.dll")] extern int WINAPI MySub(int a, int b); 書き終わったときに、MySubの下に赤線がでて「;が必要です」 というエラーが出てしまいます・・・ たぶん「WINAPI」が認識されてないと思うのですが、 どのように記述すればよいのでしょうか? ~C++での記述~ [dllcall.cpp] #include "stdafx.h" #include <windows.h> #include <conio.h>  // getch( ) を使用するのに必要 extern int WINAPI MySub(int a, int b); int _tmain(int argc, _TCHAR* argv[]) { int c; c=MySub(9, 3); printf("ans=%d\n",c); getch();// キーが押されるまで待つ return 0; } [a.cpp] __declspec(dllexport)int WINAPI MySub(int a, int b) { return a-b; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

C#では,WINAPIマクロは存在しません (呼び出し規約はDllImportで指定します)。 > [System.Runtime.InteropServices.DllImport("a.dll")] > extern int WINAPI MySub(int a, int b); ではなく, [System.Runtime.InteropServices.DllImport("a.dll")] static extern int MySub (int a, int b); のようになります。

takagoo100
質問者

お礼

ご返答ありがとうございます。 参考になりました。

関連するQ&A

  • VC++6.0 DLLの作り方

    VC++6.0でWin32 Dynamic-Link Libraryプロジェクトを作成しようとしました。 練習用に足し算と引き算です。 StdAfx.cpp test99.cpp StdAfx.h ReadMe.txt Basetsd.hなど、いろいろなファイルが出来ています。 これを親プログラムから、#include "StdAfx.h"としてリンクさせたいのですが、 StdAfx.hに、関数を公開しなければならないと思います。 StdAfx.hは、何を行うヘッダーファイルなのか? 何処に何を記述するのがベストでしょうか? VC++の生成した日本語のコメントの意味が今ひとつ理解できません。 以下はtest99.cpp #include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } __declspec(dllexport) int WINAPI tasizan(int a,int b) {return (a+b);} __declspec(dllexport) int WINAPI hikizan(int a,int b) {return (a-b);} 以下はStdAfx.cpp #include "stdafx.h" 以下はStdAfx.h #if !defined(AFX_STDAFX_H__D849B748_701B_483D_9457_AA6096D78FB0__INCLUDED_) #define AFX_STDAFX_H__D849B748_701B_483D_9457_AA6096D78FB0__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN #include <windows.h> //????????__declspec(dllexport) int WINAPI tasizan(int,int); //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。 #endif // !defined(AFX_STDAFX_H__D849B748_701B_483D_9457_AA6096D78FB0__INCLUDED_)

  • Borland C++ Compiler 5.5 無償

    Borland C++ Compiler 5.5 を無償ダウンロードして使おうとしましたが使えません gomi.cppを以下のように作り #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { fprintf("please help me!\n"); getch(); return 0; } binにおいてdosプロンプトから bcc32 gomi としたのですがエラーが出ます 統合開発環境でないので大変です この無償版を使えるようにするにはどうしたらいいのでしょうか? よろしくお願いします

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • C++でCの構造体をnewするとまずいのでしょうか?

    以下のようなCで書かれたヘッダがあったとして ---testc.h--- typedef struct __Test { int i; char c[30]; char* x; } Test; これを以下のようにnewして使うのは問題ないでしょうか? ---test.cpp--- extern "C" { #include test.h } int main(void) { Test* test = new Test(); test->i = 30; test->c[3] = 'a'; test->x = "aiueo"; return 0; }

  • DLLでLIBファイルが作成されない

    DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。 1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。 と警告が出てしまいます。 私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。 どのようにしたらLIBファイルが作成されるようになるのでしょうか? ■■■stub.h■■■ #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif typedef int (*HOGEHOGE)(int i); EXPORT class DDDClass{ private: int num; HOGEHOGE c; public: DDDClass(); int CALLBACK counter(); int CALLBACK touroku(int (*b)(int i)); }; ■■■stub.cpp■■■ #include <windows.h> #include "Stub1.h" int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ return true; } EXPORT class DDDClass; DDDClass::DDDClass(){ num =0; c = NULL; } int CALLBACK DDDClass::touroku(int (*b)(int i)){ c = b; return 0; } int CALLBACK DDDClass::counter(){ //c = b; c(num); num++; return 0; } /* EXPORT bool CALLBACK aaaaa(){ return true; } */

  • C言語で、string.h conio.hを使いたい

    C言語の勉強を「C machine」というソフトを使ってしているのですが,      #include<   >             ↑     ここに入れるファイル?で、string.h conio.hという のがないみたいでgetch()などが使えません。 そこで、この「string.h」「conio.h」などを導入したいのですがやり方がわからないので誰か教えてください。

  • C#でWin32 MFC DLLが呼び出せない

    C#で以下のエラーが発生し、非常に困ってます。 色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。 しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。 問題が分かる方、是非教えてください! using System.Runtime.InteropServices; namespace WindowsFormsApplication { public partial class Form1 : Form { [DllImport("Win32DLL_TEST.dll")] private extern static int func(int x, int y); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n = func3(5, 7);//ここでエラー! } } } エラー内容 'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。 追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) 備考 DLLは自作のWin32 DLL です。 extern "C"{ __declspec(dllexport) int __cdecl func(int x, int y) } と宣言し、VC++のMFC dialog上では呼び出しを成功しています。

  • シンボルをエクスポートするDLLの初歩的トラブル

    VC++6.0で簡単なDLL作成にチャレンジしたところ、ソースファイルの最後のところで、エンドオブファイルのエラーが出ます。教本と同じように書いたつもりですが、何処が異なっているのか分かりません。エラーを出す原因となっている箇所を御指摘下さい。 ↓ソースファイル #include "stdafx.h" #include "SUB.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } SUB_API LONG _stdcall subtract( LONG sub1 , LONG sub2 ) { return( sub1 - sub2 ); } ↓ここからはヘッダーファイル #ifdef SUB_EXPORTS #define SUB_API __declspec(dllexport) #else #define SUB_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif SUB_API LONG __stdcall subtract( LONG sub1, LONG sub2 ); #ifdef _cplusplus } #endif --------------------構成: SUB - Win32 Debug-------------------- コンパイル中... StdAfx.cpp コンパイル中... SUB.cpp C:\Program Files\Microsoft Visual Studio\MyProjects\SUB\SUB.cpp(38) : error C2059: 構文エラー : 'end of file' cl.exe の実行エラー SUB.dll - エラー 1、警告 0

  • C#でC++のDllを使用する方法について

    下記のプログラムは、MSのダイナミックライブラリの作成と使用(C++)を 参考にして作成したライブラリと、その使用側の プログラムコードです。 共に、VS2013のC++で作成しています。 Q1) プログラムの作成をVS2013のC#に変更しまして、同様なプログラムが出来ますか? 注)下記のライブラリの部分は、そのまま使用して。 お手数ですが、宜しくお願いします。 ライブラリ(Releaseフォルダーの中): MathFuncsDll.dll MathFuncsDll.exp MathFuncsDll.lib MathFuncsDll.pdb 使用側プログラムコード(VS2013のC++) //Project:c:\wk_VS2013\TT_DllLibrary\TT_DllLibrary.sln #include "stdafx.h" #include <conio.h> //MSのダイナミックライブラリの作成と使用(C++)で作成したライブラリのヘッダー #include "Release\\MathFuncsDll.h" //using namespace std; #pragma comment( lib, "Release\\MathFuncsDll.lib" ) //========================== int _tmain(int argc, _TCHAR* argv[]){ //使い分け? //int main(){ double ans, a, b; a = 1.2; b = 5.6; ans=MathFuncs::MyMathFuncs::Add(a,b); fprintf(stdout, "a=%lf b=%lf ans=%lf です\n", a,b,ans); int aa = _getch(); return 0; }

  • C言語 

    C言語でAとBがじゃんけんをして勝ち負けを出力するプログラムをつくりたいのですが、間違いを教えてください。(AがgでBがcならAの勝ち。AがgでBがpならBの勝ち。AがgでBがgなら引き分け。) #include<stdio.h> #include<conio.h> void main() { int A,B; printf("文字を入力せよ"); scanf("%d",&A); scanf("%d",&B); if(A=='g'||B=='c') { printf("Aの勝ち"); } if(A=='g'||B=='p') { printf("Bの勝ち"); } if(A=='g'||B=='g') { printf("引き分け"); } getch(); }

専門家に質問してみよう