3

テストのために、C# アプリケーション (Visual C# 2010 Express で開発) で Delphi XE2 DLL (コードを参照) を呼び出そうとしています。

procedure CLP; stdcall; export;
begin
  showmessage('TEST');
end;

exports CLP;

ただし、C# プロジェクトへの参照として DLL を追加しようとすると、次のメッセージが表示されます。

「D:\temp\test.dll」への参照を追加できませんでした。ファイルにアクセスできること、および有効なアセンブリまたは COM コンポーネントであることを確認してください。

同じ DLL を Delphi 2010 でコンパイルすると、問題なく動作します。

問題を解決する方法についての提案は大歓迎です。

4

3 に答える 3

6

アンマネージ DLL を .NET プロジェクトに追加することはできません。

ただし、関数をインポートすることはできます。たとえば、Platform Invoke チュートリアルを参照してください。

于 2012-04-10T12:20:46.517 に答える
3

アンマネージのネイティブ DLL にリンクしようとしています。そのようなものをマネージド アプリケーションに参照として追加することはできません。

DLL を呼び出す方法は、p/invoke を使用することです。

[DllImport(@"test.dll", CallingConvention=CallingConvention.Stdcall)]
static extern void CLP();

当然のことながら、DLL にパラメーターを設定し始めると、状況が少し複雑になる可能性がありますが、p/invoke を使用すると非常に長い道のりを歩むことができます。

注意すべきことの 1 つは、DLL が 32 ビットの場合はマネージ プロジェクトが x86 をターゲットにし、DLL が 64 ビットの場合は x64 をターゲットにすることです。

最後にマイナーな注意として、export最新の Delphi では の使用は無意味です。とにかくコンパイラはそれを無視するので、単純に削除する必要があります。

于 2012-04-10T13:15:32.383 に答える
0

Henk の言うとおりです。いくつか追加したいことがあります。

まず、.NET 管理の dll (アセンブリを呼び出す) である場合にのみ、dll を追加できます。ただし、管理されていない dll または exe ファイルから管理されていない関数をインポートすることはできます。したがって、適切な質問は、管理されていない dll から関数をインポートする方法です。その答えを探す必要があります。そして、最良のスタート地点はpinvokeのウェブサイトだと思います。

于 2012-04-10T13:09:32.980 に答える