質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

5927閲覧

dllimportでcのdll内の関数を呼び出す(gccコンパイラとvisual studio)

KTMEI

総合スコア44

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2017/02/01 06:27

以下のような事はできるのでしょうか。

① cのソースをgccでコンパイルしDLLを作成
② Visual StudioのC#から「①」のDLLインポート

試しに簡単なソースで試してみたらできなかったので、
やり方が悪いのかそもそもコンパイラが違うから
出来ないものなのかを知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

cygwinのgccでDLLを作ることはできます。詳細はcygwinのマニュアルの「Building and Using DLL」を参照下さい。なおそこに書いてありますが、cygwinで作ったDLLは「cyg」が頭についた名前になります。dllimportでインポートするときはこの名前を指定する必要があります。

また、dllimportで動的にインポートするのではなく、コンパイル・リンク時に使うDLLを指定しておく場合、そのDLLのインポートライブラリが必要です。cygwinでDLLを作ったときにできるインポートライブラリ (名前の頭に「lib」がつき、拡張子が「.a」) は、VC++でのインポートライブラリ (拡張子が「.lib」) としては使えません。このような場合は、.defファイルを作成してそれをもとにインポートライブラリを生成する必要があると思います。

投稿2017/02/01 12:36

ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTMEI

2017/02/02 01:05

ご回答ありがとうございます。 頂いたcygwinのサイトを確認しました。 以下のようにソースコードを作成して実験してみたのですが、 MinGWのgccを使用した場合、下記のコードの箇所で変数aに int の 6 が入ってきました。 var a = helloFunc(); しかし、Cygwinのgccを使用した場合、上記のコードのところで いきなり落ちてしまいます。 cygの接頭辞がつくとおっしゃっていましたが、cygwinの サイトには静的にライブラリとして呼び込む場合にcygの接頭辞が 必要なように見えます。これは動的にDLLを呼び出す際にも 必要なのでしょうか? (試しにDLLの名前の先頭にcygをつけてみましたが、同じように  落ちてしまいました・・。) cygwinのgccでコンパイルしたDLLを動的に読み込むのに何か他に 必要な作業、足りていない作業が有りましたらご教授ください。 以下サンプルプログラムです。 ```C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace GCCTest { public partial class Form1 : Form { //[DllImport("helloForMinGW.dll", CallingConvention = CallingConvention.Cdecl)] //static extern unsafe int helloMethod(); [DllImport("cyghelloForCygwin.dll", CallingConvention = CallingConvention.Cdecl)] static extern unsafe int helloMethod(); // delegate of c function unsafe delegate int DelegateHelloFunc(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { unsafe { try { DelegateHelloFunc helloFunc = (DelegateHelloFunc)helloMethod; var a = helloFunc(); } catch (Exception) { } } } } } ``` ```C hello.c #include <stdio.h> #include <string.h> #include <stdlib.h> __declspec(dllexport) long helloMethod(); long helloMethod() { return 6; } ``` ■MinGWのgccでコンパイルしたコマンド gcc -c hello.c -o helloForMinGWgcc.o gcc -shared -o helloForMinGW.dll helloForMinGWgcc.o ■cygwinのgccでコンパイルしたコマンド gcc -c hello.c -o helloForCygwingcc.o gcc -shared -o helloForCygwin.dll helloForCygwingcc.o
ikedas

2017/02/02 02:23

- エラーメッセージなどは表示されていませんか。 - また、cygwinのgccでコンパイル・リンクしたものは実行時にcygwin1.dllが必要ですが、パスは通っているでしょうか。 なお、当方は今すぐに試せる環境がないのですが、デバッグビルドしてデバッガでトレース実行してみると、詳しいことがわかるかもしれません。
KTMEI

2017/02/02 04:18

本コメント投稿時は、エラーもなく落ちていました。 先程試したところ、「vshost.exeは動作を停止しました」の ポップアップが出て、落ちてしまいます。 ポップアップの際に出てくるログの内容(問題の詳細の表示)は 以下のようになっています。 問題の署名: 問題イベント名: APPCRASH アプリケーション名: GCCTest.vshost.exe アプリケーションのバージョン: 12.0.30723.0 アプリケーションのタイムスタンプ: 53cf4fe5 障害モジュールの名前: clr.dll 障害モジュールのバージョン: 4.6.1087.0 障害モジュールのタイムスタンプ: 583e5e56 例外コード: c0000005 例外オフセット: 00000000005b57bc OS バージョン: 6.1.7601.2.1.0.256.48 ロケール ID: 1041 追加情報 1: e8ee 追加情報 2: e8eeef281cb8a34cc1d7843a0b67867f 追加情報 3: 684e 追加情報 4: 684ef898f8eb5bca866c395e2cb44902 オンラインのプライバシーに関する声明をお読みください: http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0411 オンラインのプライバシーに関する声明が利用できない場合は、プライバシーに関する声明をオフラインでお読みください: C:\Windows\system32\ja-JP\erofflps.txt 尚、「cygwin1.dllのパスは通っているか」ですが、 環境変数のpathにcygwin1.dllのパスを入れていて、 gccのコマンドを打つと、環境変数のpath配下のgccが 実行されているので、問題ないと考えています。
ikedas

2017/02/02 04:52

うーん、ちょっと原因がわからないです。 - VC++で、ホスト プロセスを作成しないようにして再コンパイルして試してみては。 https://msdn.microsoft.com/ja-jp/library/ms185330.aspx 今のところ、これくらいしか思いつきません。
KTMEI

2017/02/15 00:36

こちらを実施してみましたが、やはりcygwinのgccでコンパイルした場合はインポートが出来ませんでした。 MinGWのgccでは問題なくインポート出来ているので、インポートの実装自体は問題ないと思うのですが・・・。
ikedas

2017/02/15 09:03

あと、32ビット版と64ビット版でやっているということはないですよね。それだったらそもそも動かない気もしますが。
KTMEI

2017/02/15 23:44

gccのコンパイラはx64を使用し、C#側もx64です。 以下のgccを試しました。後者がx64のgccと認識しています。 --- gcc.exe x86_64-pc-cygwin-gcc-6.3.0.exe ダウングレードとかすると出来る可能性ってあるんでしょうか・・・。 (バージョン固有の不具合とか・・?)
guest

0

こんにちは。

実際にやったことはないのですが、gccがMinGWの意味でしたら原理的には出来るはずですよ。
Windows APIもC言語I/Fのdllです。それをC#から呼び出せます。それと同じです。

gccがlinuxやunix、cygwin上のものでしたら、原理的にできないと思います。

投稿2017/02/01 06:39

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTMEI

2017/02/01 07:04

回答ありがとうございます。 変な質問の仕方になっているかもしれないのですが・・・ Cソース自体はLinux上のgccでコンパイルして使っていました。 このソースをWindows上にファイルを持ってきてCygwinのGCCで コンパイルして内部の関数を使えないかと考えていました。 つまり、cygwin上のgccだと、結局はUnixのgccを実行している為、 Linux用のモジュールが出来上がることになり、Windows上では 実行できないという認識でいいのでしょうか。 MinGWのGCCであれば、Windowsのコンパイラとして動作するため、 C#から呼び出すことが出来るという認識でいいでしょうか。
Chironian

2017/02/01 08:01

> cygwin上のgccだと、結局はUnixのgccを実行している為、 > Linux用のモジュールが出来上がることになり、Windows上では > 実行できないという認識でいいのでしょうか。 調べてみまたところcygwinについて理解不足してました。すいません。 cygwinの場合、linux用モジュールができるわけではなくWindows用のモジュールのようです。 ならば、ロードはできるのでC#とリンクできるかどうかが問題です。通常のC言語I/FであればC#からも呼べるはずですので、まずは普通にMinGWがらcygwinのdllを呼び出せるかどうかやってみては如何でしょうか? > MinGWのGCCであれば、Windowsのコンパイラとして動作するため、 > C#から呼び出すことが出来るという認識でいいでしょうか。 その通りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問