把Lua加入C++ DLL中,会使其无法与C#兼容吗?

我正在使用WPF和C#制作一个调用未托管的C++ .dll的用户界面。我尝试使用平台调用方法,以及通过使用/clr选项编译C++代码来实现(这更好)。这两种方法都可以正常工作,直到C++ .dll使用包括标准Lua头文件的任何代码。确切地说,当作为 .exe 编译 C++ 代码,并且 .dll 被另一个 C++ 项目调用时,C++ 代码可以正常工作。

只是为了测试,当使用 PInvoke 时,C# 侧类似于下面的第一个代码块:

namespace ThermoSIM_UI
{
    public class CppInterface
    {
        [DllImport("ThermoSIMDLL_1.2.dll")]
        public static extern int TestPassString();

        public CppInterface()
        {
            TestPassString();
        }
    }
}

而C++ .dll 的头文件是这样的:

#ifdef THERMOSIMDLL_EXPORTS
#define THERMOSIMDLL_API __declspec(dllexport)
#else
#define THERMOSIMDLL_API __declspec(dllimport)
#endif

extern "C"
{
    THERMOSIMDLL_API int TestPassString();
}

正如我所说,这很好用,直到我在C++ .dll中使用了包含Lua头文件的代码文件:

extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include "luajit.h"
}

啊,而且C#错误是这个:

A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll

Additional information: The invocation of the constructor on type 'ThermoSIM_UI.MainWindow' that matches the specified binding constraints threw an exception.

此外,在输出窗口中还有这个:

A first chance exception of type 'System.BadImageFormatException' occurred in ThermoSIM_UI.exe
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
A first chance exception of type 'System.Xaml.XamlObjectWriterException' occurred in System.Xaml.dll
A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll
Additional information: The invocation of the constructor on type 'ThermoSIM_UI.MainWindow' that matches the specified binding constraints threw an exception.
The program '[8048] ThermoSIM_UI.vshost.exe: Managed (v4.0.30319)' has exited with code -1 (0xffffffff).

BadImageFormatException似乎与.dll具有不同的构建配置有关,例如将x64与x86混合在一起或其他原因引起的。无论如何,我还没有弄清楚。

有没有人遇到过这种情况,或者对这个.dll为什么与C# 不兼容有什么想法?

点赞
用户1783976
用户1783976

根据 @Schollii 的建议,解决了问题:如果我使用 Visual Studio 自己构建 Lua,它就能够工作。这个 StackOverflow 帖子帮了我,只需要做一个小修改:Lua in visual studio 2012?

  1. 下载 Lua 文件 lua.org/download.html。
  2. 创建一个新的 Visual Studio 项目以创建库,我创建了一个静态库。
  3. 移除解释器文件 lua.c,因为它与 luac.c 冲突。
  4. 使用与我的 C++ dll 相同的设置进行编译,即 x64,Release。

现在,C# 项目可以调用 C++ dll。

2014-03-10 21:59:50