在C#中从DLL运行代码时出错

时间:2013-03-04 20:25:43

标签: c# visual-studio dll dllimport

我似乎无法克服这个错误,所以我想知道我的调用代码或我的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;
}

2 个答案:

答案 0 :(得分:4)

Assembly.LoadFile只能用于加载.NET程序集,而您正在尝试加载普通的.DLL。您需要使用P / Invoke才能从.NET中调用dll中的方法。尝试在课堂上添加以下声明:

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

然后像调用任何其他.NET方法一样调用它。

答案 1 :(得分:0)

首先,我认为你的后期绑定调用是错误的,应该是:

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

如果您想通过延迟绑定真的这样做,请查看博客here

还有其他人指出使用P / Invoke。