エクスポート可能な関数をいくつか使用してC#DLLを作成しようとしています。次に、C++ /管理されていないプログラムでその.dllをロードし、dllの中で特定のエクスポート関数を呼び出すようにします。C#DLL - エクスポート関数
私はRobert Giesecke's Unmanaged Exportsを使用しています。しかし、それは動作していないようです。
私は、デバッガで管理されていないプログラムを実行し、それが成功し「のLoadLibrary()」が、それは「のGetProcAddress(test_start)」にしようとしたときに呼び出しが失敗し、ゼロを返しを行います。
これは私のC#のコードです:
using System.Runtime.InteropServices;
using RGiesecke.DllExport;
using etc...;
namespace test_dll
{
public class Class1
{
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllExport("test_start", CallingConvention = CallingConvention.Cdecl)]
public static void test_start()
{
MessageBox.Show("It works","YES");
}
}
}
.dllには、罰金やCPUの試合(x86の)を構築するが、C#のDLLがロードされた後に管理されていないプログラムは、エクスポート関数のアドレスを取得することはできません。
これはかなり基本的なものですが、私はそれを動作させようとしています。私は後で輸入が必要になります。
何か助けてください、ナゲットパッケージのドキュメントはかなり薄いです。ありがとう
'GetProcAddress'の呼び出しが失敗した後、' GetLastError'は何を返しますか?正しいモジュールハンドルを 'GetProcAddress'に渡していると仮定します。生成されたdllのEXPORTSセクションを見て、 'test_start'のスペル(大文字小文字を含む)が期待どおりであることを確認しましたか? –
'DllExport'はいつも私が聞いたことから非常に厄介な解決策でした。より良い解決策は、管理されたコードとunmangedコードの間の橋渡しとしてC++/cliを使用することです。それからunmanged関数を公開してから、C#の管理対象関数に呼び出しを転送します。 [このMSDNブログの記事](https://blogs.msdn.microsoft.com/soultech/2010/07/27/the-bridge-a-pattern-to-leverage-managed-c-code-from-an- unmanaged-c-code-base /)を実行します。 –
@ Scottの推奨に加えて、ライブラリをCOMサーバーとしてビルドし、クラスをCOMオブジェクトとしてエクスポートすることもできます。これはもう少し重くなりますが、より汎用的なソリューションを提供します(つまり、COMサーバーはさまざまなクライアントコードシナリオで動作します)。現在の問題をデバッグするには、dumpbin.exeを/ exportsオプションとともに使用して、サードパーティ製の 'DllExport'とビルドアクションがあなたのためにエクスポートされているかどうかを確認することができます。 –