0

このエラーを乗り越えることができないようです。そのため、呼び出しコードまたはDLLで何か問題が発生しているのではないかと思います。

-エラー-

$exception  {System.BadImageFormatException: The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)

-コールコード-

 Assembly assembly = Assembly.LoadFile(@"C:\Users\Admin\Documents\Visual Studio 2012\Projects\MyDLL\Release\myDLL.dll");
            Type type = assembly.GetType("HelloWorld");
            var obj = Activator.CreateInstance(type);

            // Alternately you could get the MethodInfo for the TestRunner.Run method
            type.InvokeMember("HelloWorld",
                              BindingFlags.Default | BindingFlags.InvokeMethod,
                              null,
                              obj,
                              null);

-DLLコード-

#include <Windows.h>

using namespace std;

extern "C" _declspec(dllexport) void __stdcall HelloWorld(LPSTR title, LPSTR msg)
{
   MessageBox( NULL, msg, title, MB_OK);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
4

2 に答える 2

4

Assembly.LoadFileプレーンな.DLLをロードしようとしているのに対し、.NETアセンブリのロードにのみ使用できます。.NETからdll内のメソッドを呼び出すには、P/Invokeを使用する必要があります。クラスに次の宣言を追加してみてください。

[DllImport("myDll.dll")]
static extern void HelloWorld(string title, string msg);

次に、他の.NETメソッドと同じように呼び出します。

于 2013-03-04T20:30:18.223 に答える
0

まず、遅延バインディングの呼び出しが間違っていると思います。次のようにする必要があります。

obj.InvokeMember("NameOfYouyMethod", 
                 BindingFlags.Default | BindingFlags.InvokeMethod, 
                 null, obj, new object[] { YourParameters );

また、遅延バインディングを介してこれを実際に実行したい場合は、こちらのブログを確認してください。

また、他の人が指摘しているように、P/Invokeを使用してください。

于 2013-03-04T20:32:43.417 に答える