1

Robert Giesecke の " UnmanagedExports " nuget パッケージを使用して C# アンマネージ DLL を作成しようとしていますが、エントリ ポイントが作成されていないようです。

完全なコードはこちら:

using System.IO;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;

namespace ImpactHive
{
    internal static class Main
    {
        [DllExport("_RVExtension@12", CallingConvention = CallingConvention.StdCall)]
        static void RVExtension(out char output, int outputSize, char function)
        {
            using (StreamWriter writer = new StreamWriter(@"C:\dll_log.txt"))
            {
                writer.WriteLine("It works!");
                writer.WriteLine(function);
            }

            output = function;
        }
    }
}

私は何を間違っていますか?

説明:

これは、署名付きの「 」という名前のエントリ ポイントを必要とするArma 3 用の拡張 DLL です。_RVExtension@12

void __stdcall RVExtension(char *output, int outputSize, const char *function);

編集:プロジェクト設定でターゲットプラットフォームをx86として指定しましたが、うまくいきませんでした。

4

1 に答える 1

1

[DllExport]属性が意図したとおりに機能していたことがわかりました。

私が抱えていた問題は、C# にネイティブ属性がない理由の 1 つです[DllExport]。C# dll がエントリ ポイントを表示するには、DLL の呼び出し元に .net フレームワークが読み込まれている必要があります。

問題は、公開されたエントリ ポイントを確認するために使用していたアプリが .net フレームワークを読み込まなかったため、エントリ ポイントを報告しなかったことです。

これは、VS2013 の開発者コマンド プロンプトを開いて実行することで確認されdumpbin /exports "C:\myDllName.dll"、次の結果が返されました。

Dump of file C:\myDllName.dll

File Type: DLL

  Section contains the following exports for \myDllName.dll

    00000000 characteristics
    54F6EC86 time date stamp Wed Mar 04 11:29:10 2015
        0.00 version
           0 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          0    0 000028CE _RVExtension@12

  Summary

        2000 .reloc
        2000 .rsrc
        2000 .sdata
        2000 .text

露出したエントリポイントを明確に示しています...

これは、Arma 3 ゲーム エンジンがデフォルトで .net フレームワークをロードせず、そのため私の C# dll を呼び出すことができないため、拡張機能にこの dll を使用できないことを意味します。

于 2015-03-04T17:18:51.143 に答える