• 締切済み

C#とCでの定数共用に関して

現在、C(native)でDLL,C#でそのDLLを使ったアプリを開発しています。(Microsoft VisualStudio2008) DLL/アプリともC#あるいはC/C++で記述すれば問題ないのですが、諸般の事情でこのような形態になっていますので、これに関しての意見は無用です。 質問ですが、DLL内の関数の呼び出し時に引数として意味をもった定数を使用する - (たとえばWIN32で使うWM_**等のように) - のですが、この定数値をC#のアプリとでうまく使いまわす手段がないかを探しています。 C#にはCのようにヘッダファイルをインクルードすることができないので、もしやるとすれば、Cのヘッダを何らかのスクリプトで自動変換してC#でそれ用のenumを含むクラス定義のあるソースファイルを自動生成するなどは思いつきますが、スマートな方法ではないですよね。 #C/C++は何十年と使っていますが、C#はごく最近始めました。 なにかもっと簡便な方法はあるのでしょうか。 よろしくお願いいたします。

みんなの回答

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

native側をCOMにする。

pochi2tama
質問者

お礼

ご回答、ありがとうございます。 補足に書き忘れたのですが、再編集できないのでこちらに書いておきます。 DLLはネイティブ 自分のアプリ:C# 他人のアプリ:C/C++(ネイティブ) です。 #自分のあぷりをC/C++(ネイティブ)に書き換えれば問題ないのですが。

pochi2tama
質問者

補足

もともと組み込み系をやっていたのでVisualStudio(Microsoft)環境はこれが初めてで、COMに関して余り良く知らないのですが、DLL側にCOMを使うと、識別子を使わないで記述できる仕組み?があるのでしょうか。 #識別子を渡す代わりに関数を呼ぶという方法も考えられますが、冗長ですよね。 後出し情報のようになって申し訳ありませんが、もともとはすべてC#で記述していたものを、外部からの要求で、演算部分のみをDLL化する際にネイティブ化したものです。 外部の人はコンパイル済みDLL(ソース提供は出来ない)を使ってネイティブ環境で使う物です。

関連するQ&A

  • ネイティブのDLLをC++/CLIに対応させるためのヘッダファイル

    ネイティブのDLLをC++/CLIに対応させるためのヘッダファイル 現在ネイティブのDLLをVisual StudioのC++/CLIに対応させる作業をしていますが、順調に進んでいません。 ネイティブのDLLをC++/CLIに対応させたヘッダファイルがあれば参考にしたいのですが、何か参考にできるホームページ等、紹介して頂けますか?

  • C++のdllの作り方を教えてください。

    こんにちは。 先週、「UNIXのC++で共通クラスを作りたい。」って言う質問をした orange_pieと申します。 そのバージョンアップ質問として、作成した共通クラスをDLLにして みんなに提供したいのですが、コンパイルはアーカイブを作る時と どう違うのでしょうか? ちなみに、コンパイルした後でarコマンドを使ってアーカイブを作っていました。 % gcc -c aaa.cpp % ar -r libaaa.a aaa.o dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? また、できあがったdllを使う側では、ヘッダーファイルをインクルードして LIBパスの通ったところにdllを入れておけば良いのでしょうか? どなたか教えてください。

  • なぜ、C++の標準ヘッダをインクルードするとき拡張子をつけないのか。

    なぜ、C++の標準ヘッダをインクルードするとき拡張子をつけないのか。 そもそもiostreamなどは拡張子をもっているのですか? 拡張子はあるけれどインクルードするときに付けてないだけとか?だとしたら、同じファイル名で拡張子の違いで判別できないですよね?a.hとa.hppがあったら#include <a>じゃわからないって意味。 自分でヘッダーファイルを作る場合はどのようにすればいいのでしょうか? 自分で作ったヘッダーファイルも標準ヘッダの様に拡張子を付けないでインクルードすることができますか?そういった事はするべきではないのでしょうか? この拡張子をつけないというのはC++の標準ヘッダだけ特別仕様とか? Cと同じように.hでヘッダーファイル作って#include "a.h"とかにしておけばいいのかなー?? 詳しい方、わかりやすく説明して頂けないでしょうか。よろしくお願いします。

  • error C2065: error C2057: が出てしまいます。

    VC++6.0 ダイアログベースです。 自動で作られたダイアログのヘッダファイルを 自作で作ったクラスのヘッダファイルでインクルードした所 下記のようなエラーが出てしまいました。    error C2065: 'IDD_MY_DIALOG' : 定義されていない識別子です。 error C2057: 定数式が必要です。    まだ自作で作ったクラスはクラスになる前のインクルードのみ書かれた 状態ですが・・・。      //自作する予定のヘッダファイル(まだインクルードのみ) #pragma once #include "DLGTEST.h"//自動で作られたダイアログ //自作のファイル(まだインクルードのみ) #include "stdafx.h" #include "gakusei.h"    自動で作られたファイルをインクルードすることは出来ないのでしょうか? もしインクルードできるならどのようにしたらインクルードできるのでしょうか? オンラインマニュアルで調べたのですが、良くわかりませんでした。 /**オンラインマニュアルより、解決方法**/   stdafx.h からの VC_EXTRALEAN 行を定義する 1 つソリューションが#を削除できます。 これは、通信とレジストリとほかのエリアの MFC によってプロジェクトで直接が使用されない Win32 API を保持します。 含められない代替は、#のセットでの行が「#が VC_EXTRALEAN を定義するのを」置き換えるために、 上記で一覧された行を定義しこと、そしてハードウェアがそれその#が定義する削除によって選択的に登録されこと、です。 たとえば 通信 API が呼び出される場合、#がすべて上記で stdafx.h に「#が NOCOMM を定義すると、」行の以外、 一覧された行を定義するのを持つ可能性があります。

  • 初心者です。VisualStudioについて教えてください。(C++)

    初心者です。VisualStudioについて教えてください。(C++) VisualStudioのWindowsフォームプロジェクトを作成すると 「Form1」という簡易画面が自動で作成されます。 その画面にボタン等を追加していくと、そのボタン押下時の処理が 「Form1.h」にどんどん追加されていきます。 なぜヘッダファイルに処理の実装を記述していくのでしょうか? 基本的に、ヘッダとは関数やクラスを定義するだけのもので 実装はcppファイルに記述していくものだと研修等で教わったのですが。 なぜなのでしょう? ご教授下さい。 また、「Form1.h」ではなく「*.cpp」ファイルに実装を記述したい場合 どうのようにすればよいのでしょうか?

  • C++のヘッダーについて

    C++のプログラミングをしています そこで出てきた問題なのですが・・・ class Aのヘッダファイルa.hをほかのcppファイルにインクルードすると、 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2146: 構文エラー : ';' が、識別子 'test' の前に必要です。 とほかのヘッダファイルでコンパイルエラーがでます ヘッダファイルをインクルードしたときのみこのエラーがでて困っています。 解決法や、ヒントになりそうな事例を知りませんでしょうか?

  • Visual C++2005でMFC形式(?)のDLLを含んだSDKの利用について

    環境:Win2000 SP4 VS2005 pro SP1 現在大学で実験をするためのプログラムを作成しようとしています。 前任者が作った実験用プログラム(Win32API)があり、それに今年購入したハードウェアのSDKを導入することでプログラムの拡張を図っています。 (具体的には今までの測定に追加して動画解析を行おうとしてるのですが・・・) そこでそのSDKの説明書通りにインクルードフォルダを設定し、libファイルを設定しました。 それからソースに説明書通りにヘッダーをインクルードしました。 (このヘッダーファイルをインクルードすることによりSDKに含まれる3つのDLLがすべて読み込まれるらしいです) そこでとりあえずインクルードだけしてコンパイルしてみたところ SDKに含まれるヘッダーファイル中にCStringの構文エラーが出ました error C2061: 構文エラー : 識別子 'CString' 説明書によるとSDKに含まれるDLLのうち1つはwin32DLLで残り2つはMFC標準DLLというもののようです。 プロジェクトのプロパティから文字コードをマルチ、Unicodeとやってみましたがダメでした。 またMFCの利用設定もすべて試してみましたがダメでした。 今までVSをさわったことがなくC言語も少しかじったことがあるだけなので困り果てています。 回答よろしくお願いします。

  • C#、C++間のDLLの呼び出しについて

    いつも拝見させていただいております。 さっそくですが、質問致します。 現在、ネイティブなC++ DLLを作成しています。 これを今回、C#のアプリケーションから呼び出すことになりました。 DLL内にはクラスを作成しており、内部にXMLのデータを保持するような クラスを作成しております。(XML操作にはMSXMLを使用しております。) 問題なのはC++アプリケーションから呼び出した時は正常に動作するのですが、C#からの呼び出しの時はC++アプリケーションから呼び出した時には発生していないエラーが検出されます。 エラー内容は System.AccessViolationException 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 になります。 エラー内容からしてC++内でのメモリ操作に問題があると 思われるのですが、C++からの実行時には検出されていないので理由がわからずに困っております。 ネイティブなDLLに対してはデバッグも行えないため、手に負えません。 (現在、1行ごとにログを埋め込み、TCHAR型のnewを4byte行っている箇所で処理がストップしてしまっているようです。C++からの呼び出し時には正常に処理される箇所です。) ネイティブなDLLに対してのデバッグ方法や似たような現象にあわれた方がいらっしゃいましたらご助力お願い致します。 ・対象のDLLのクラスは_declspec(dllexport)にてエクスポートを行っています。 ・C#からの呼び出し時にはネイティブなDLLのためC++/CLIで作成したプロジェクトでラッパークラスを作成してアクセスを行っています。 ・C++アプリケーションからの呼び出し時はプロパティの設定でインクルードディレクトリ、LIBファイルの設定等を行って直接DLLを参照して 実行(呼び出し)しています。

  • 自作ヘッダファイルについて (C言語)

    今ヘッダファイル自作について勉強しています。 ヘッダファイルの作り方、自作ヘッダファイルのインクルード方法などはわかったのですが、作ったヘッダファイルはどこに置けばいいのでしょうか?コンパイラは Visual C++ 2008 です。回答よろしくお願いします。

  • Visual C++ 7.0 について

    Visual C++ 7.0 でコンパイルオプション?(インクルードさせたいヘッダーファイルがあるフォルダ)を設定させるには、どのような操作を行うのでしょうか?

専門家に質問してみよう