2013-03-04 83 views
0

我似乎无法通过这个错误,所以我想知道如果我在我的调用代码或我的DLL做任何错误?从C#运行代码错误的DLL#

-Error-

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

-call代码 -

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

Assembly.LoadFile只能用于装载.NET组件,而你”试图加载一个普通的.DLL。您需要使用P/Invoke才能从.NET中调用您的dll中的方法。尝试添加下面的声明你的类:

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

然后调用它,就像任何其他的.NET方法。所有的

+0

非常感谢,先生。 :> – CyanPrime 2013-03-04 21:42:45

0

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

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

同时检查博客here如果你想真正通过后期绑定做到这一点。

也像其他人指出使用P/Invoke。