2016-07-25 6 views
2

エクスポート可能な関数をいくつか使用して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がロードされた後に管理されていないプログラムは、エクスポート関数のアドレスを取得することはできません。

これはかなり基本的なものですが、私はそれを動作させようとしています。私は後で輸入が必要になります。

何か助けてください、ナゲットパッケージのドキュメントはかなり薄いです。ありがとう

+0

'GetProcAddress'の呼び出しが失敗した後、' GetLastError'は何を返しますか?正しいモジュールハンドルを 'GetProcAddress'に渡していると仮定します。生成されたdllのEXPORTSセクションを見て、 'test_start'のスペル(大文字小文字を含む)が期待どおりであることを確認しましたか? –

+2

'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 /)を実行します。 –

+0

@ Scottの推奨に加えて、ライブラリをCOMサーバーとしてビルドし、クラスをCOMオブジェクトとしてエクスポートすることもできます。これはもう少し重くなりますが、より汎用的なソリューションを提供します(つまり、COMサーバーはさまざまなクライアントコードシナリオで動作します)。現在の問題をデバッグするには、dumpbin.exeを/ exportsオプションとともに使用して、サードパーティ製の 'DllExport'とビルドアクションがあなたのためにエクスポートされているかどうかを確認することができます。 –

答えて

1

実際に私はそれを完全にうまくやっていました。

奇妙なRobert GieseckeのUnmanaged Exportsは最初のエクスポートを無視しますか?

私はその下に作成した輸出物が働き、認識されました。

私はCFFエクスプローラで有効なエクスポートを確認しましたが、最初のものを除くすべてがそこにありました。だから私は一番上に空の輸出を残した。

関連する問題