C#で使用されるDLLを作成する方法

私はWin CEを実行しているICOP VDX-6354ボードを持っています。私はC#プログラムからボードのブザーを制御しようとしています。私はすべてのplaysoundなど "coredll.dll"プラットフォームの呼び出しを試みました。彼らのどれも今まで働いていませんでした。だから私の最後のチャンスは自分自身のDLLを作成することです。

unsigned char inp(short addr)
{
    unsigned char cValue;
    _asm
    {
        mov dx, addr
        in ax, dx
        mov cValue, al
    }
    return cValue;
}
void outp(int addr, unsigned char val)
{
     __asm
    {
        push edx
        mov edx, DWORD PTR addr
        mov al, BYTE PTR val
        out dx, al
        pop edx
    }
}
bool MyBeep(DWORD dwFreq, DWORD dwDuration)
{
    outp(0x43, 0xb6);//Set Buzzer
    outp(0x42, (0x1234dc/dwFreq));//Frequency LSB
    outp(0x42, (0x1234dc/dwFreq) >> 8);//Frequency MSB
    outp(0x61, inp(0x61) | 0x3);//Start beep
    Sleep(dwDuration);
    outp(0x61, inp(0x61) & 0xfc);//End beep
    return TRUE;
}

上記のコードは、ボードのデータシートにあります。私はそれをDLLとしてコンパイルし、次にC#プログラムのように呼び出す

[DllImport("Buzzer.dll", EntryPoint = "MyBeep")]
public static extern void MyBeep(uint dwFreq, uint dwDuration);

私はコンパイル時に次の接頭辞を使用しました。

extern "C" __declspec(dllexport) bool MyBeep(DWORD dwFreq, DWORD dwDuration)

うまくいけば、私はブザーを制御することができるだろう。私の問題は、コンパイルに成功できなかったことです。私はここの手順に従ったが、それは私を助けなかった。

私は何段階で何をすべきですか?

編集:

私はDLLを構築したと思う。私は別の方法でDLLを構築しようとしました。ここにあります

今、私はC#スタートアッププロジェクトのデバッグフォルダにDLLをコピーしました(プロジェクトの他のDLLもこのフォルダにあります)。私はMyBeep関数をMyBeep.DLLからC#プロジェクトに呼び出そうとします:

[DllImport("MyBeep.dll", EntryPoint = "MyBeep")]
public static extern bool MyBeep(UInt32 dwFreq, UInt32 dwDuration);

しかし、次の例外があります。

PInvoke DLL 'MyBeep.dll'が見つかりません。

何か不足していますか?私が今まで何をしたのかを理解するためにDLLを作成することを私が気にした上記のリンクを確認してください。 よろしく。

9
コンパイラとプラットフォームは何ですか?
追加された 著者 flipchart,
デバッグのためにdllを起動することはできません(ホストするexeなし)。 「再生」(例えば、デバッグ)ボタンを押す代わりに、「デバッグなしでコンパイル」コマンドを見つけてください。
追加された 著者 Sam Axe,
ええ、ない。それは私ができることは明らかです。がんばろう。
追加された 著者 Sam Axe,
何が失敗した?エラーメッセージ?どうやって造りましたか?要するに、より詳細な情報をお願いします。
追加された 著者 David Heffernan,
+1は非常に本物の質問のように思える。
追加された 著者 Chris Marisic,
@OğuzSezer - ヘルプが必要な場合は、コンパイラが提供するエラーを投稿してください。最初の最初のスタートは、アプリケーションではないものをデバッグしようとするのを止めることです。私たちはより多くの情報を必要としています。それは...この質問に答えを与えることはできません。
追加された 著者 Security Hound,
@OğuzSezer - アプリケーションでdllを見つけることができない場合、適切な場所にはありません。あなたはどこに置いていますか?なぜそれを登録しようとしているのですか?これを行う必要はありません。これはCOMライブラリではありません。
追加された 著者 Security Hound,
それは正常にコンパイルされませんでした。私が私の質問で述べたように、私はステップバイステップのチュートリアル「方法」をたどりました。私がコンパイルしようとすると、 "Executable for Debug Session"が尋ねられました。また、ドロップボックスで実行可能な唯一の実行可能ファイルはRegSvr32です。 RegSvr32を選択して続行すると、別の警告画面でusage:regsrv32 [/ u] [/ n] [/ i]などが表示され、コンパイラにエラーは発生しません。
追加された 著者 Oğuz Sezer,
Visual Studio 2005.空のC ++プロジェクト(アプリケーションタイプDLL)。
追加された 著者 Oğuz Sezer,
@ブーあなたはより明確にすることができますか、私は前にこれをしていない。
追加された 著者 Oğuz Sezer,
@Ramhound VSは間違いを与えておりません。 regsrv32の警告画面が表示され、コンパイルが停止します。警告ポップアップ画面では、usage:regsrv32 [/ u] [/ n] [/ i]と表示されます。多分、誰かがこれをやったのですが、C#で使われるDLLをビルドする方法を教えてくれるでしょう。
追加された 著者 Oğuz Sezer,
@Ramhound私はC#スタートアッププロジェクトのデバッグフォルダにDLLをコピーしました(プロジェクトの他のDLLもこのフォルダにあります)
追加された 著者 Oğuz Sezer,

2 答え

あなたには2つの問題があります:

  1. dllをビルドし、デバッグするのではなく、デバッグする必要があります。 C#プロジェクトと同じプロジェクトにある場合は、C#プロジェクトをスタートアッププロジェクトとして設定します(プロジェクトファイルを右クリックします)。そうでない場合は、ショートカットを使用している場合は、[ビルドを開始]ではなく[ビルド]キーはおそらくCtrl + Shift + B [C#環境設定を使用している場合]またはF7 [C ++環境設定を使用している場合])です。

  2. 適切な場所にDLLを置く必要があります。これを自動化したいのであれば、C ++プロジェクト(プロジェクトのプロパティ、ビルド後のアクション、ビルド後のビルド)にpost-buildステップを追加するだけです。これは copy "$(TargetPath)" "$ (SolutionDir)\ CsProj \ bin \ $(ConfigurationName)\ *。* "

これらのマクロのいくつかは少しばかりかもしれませんが、あなたは一般的な考えを得るべきです。

編集:また、C#プロジェクトの前にC ++プロジェクトが構築されていることを確認する必要があります。 C#プロジェクトファイルを右クリックし、[プロジェクトの依存関係]に移動し、[依存]ボックスでC ++ライブラリを選択します。ビルド後の手順を確認するには、C ++プロジェクトを単独でビルドして、C#プロジェクトの正しいディレクトリにDLLをコピーすることを確認してください。出力されていない場合は、出力ウィンドウにエラーが表示されます。あなたがチュートリアルに従ってDLLを作成したなら、あなたは大丈夫でしょう。

1
追加された
いいえ、まだ動作していません...
追加された 著者 Oğuz Sezer,

エラーメッセージには別の方法が示唆されていますが、エクスポートされた機能の名前を確認する必要があります。 Win32では常にこのツールを使用します。 CE dllの場合は、おそらくダンプビン/ a>作品。

Functonの名前は __ MyBeep と呼ばれることがあります。私はこのプレフィックスがCの規約であると信じています。

0
追加された