使用C++;C#项目中的DLL 我得到了一个C++的DLL,它必须集成在一个C项目中。
我想我找到了正确的方法,但是调用dll会产生以下错误: System.BadImageFormatException:试图加载格式不正确的程序。(HRESULT的异常:0x8007000B) 这是dll中的函数:使用C++;C#项目中的DLL 我得到了一个C++的DLL,它必须集成在一个C项目中。,c#,c++,dll,dllimport,C#,C++,Dll,Dllimport,我想我找到了正确的方法,但是调用dll会产生以下错误: System.BadImageFormatException:试图加载格式不正确的程序。(HRESULT的异常:0x8007000B) 这是dll中的函数: extern long FAR PASCAL convert (LPSTR filename); 这就是我在C语言中使用的代码# 关于如何进行这项工作有什么想法吗 非常感谢, Frank尝试将C代码从任何CPU切换到x86(在属性对话框中)。导出的函数使用PASCAL调用约定,该约定
extern long FAR PASCAL convert (LPSTR filename);
这就是我在C语言中使用的代码#
关于如何进行这项工作有什么想法吗
非常感谢,
Frank尝试将C代码从任何CPU切换到x86(在属性对话框中)。导出的函数使用
PASCAL
调用约定,该约定在Windows中与stdcall
相同。Net运行时需要知道这一点,因此请按如下方式修改您的C#方法签名:
[DllImport("convert.dll", SetLastError = true, CallingConvention=CallingConvention.StdCall)]
static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename);
尝试在从DLL导出的函数中使用
\uu stdcall
(或WINAPI
或apitery
)
<强> 1——创建C++ dll <强> < /p> 在VisualStudio中
**New->Project->Class Library** in c++ template Name of project here is first_dll in visual studio 2010. Now **declare your function as public** in first_dll.h file and write the code in first_dll.cpp file as shown below.
第一个_dll.dll文件是在调试文件夹中创建的
2-将其链接到C#项目中
开放式C#项目
在C#项目的顶部添加此行
现在,可以在某些函数中使用下面的语句访问该文件
double var = Class1.sum(4,5);
< >我将VS2010中创建的C++项目DLL链接到VS2013中创建的C项目。它工作得很好 同样的结果。。。System.BadImageFormatException:试图加载格式不正确的程序。(来自HRESULT:0x8007000B的异常)@Frank:Exception指向DLL和C#代码中的x86/x64不匹配。如果C++代码编译为X64,尝试将C代码也设置为X64(反之亦然,如果代码是x86)。在处理DllImport时,这是导致该异常的唯一原因(根据Microsoft文档-)。第一行中有太多的错误,因此删除了以下内容:[DllImport(“convert.dll”,SetLastError=true,CallingConvention=CallingConvention.StdCall)]静态外部Int32 convert([Marshals(UnmanagedType.LPStr)]字符串文件名);但仍然存在相同的错误System.BadImageFormatException:试图加载格式不正确的程序。(HRESULT的例外情况:0x8007000B)请提供有关平台、项目设置和所用DLL的更多详细信息。(架构x86/x64等)我必须使用dll“原样”。。。不允许更改在不同的头文件中(也在WinDef.h中)有不同的PASCAL声明,但是
\uu stdcall
的dierct用法将以相同的方式解释way@Frank:哦!DLL不是源于您的代码,可能DLL有另一种格式,如64位等?您可以使用Visual Studio或dependencywalker www.dependencywalker.com中带有/headers参数的dumpbin.exe来查看有关dllpffff的详细信息。。。dependency walker显示:错误:至少有一个文件不是32位或64位Windows模块,未找到PE签名。此文件似乎是一个16位Windows模块。我可能错了,但这看起来不太好。。。
Check **Project-> Properties -> Configuration/General -> Configuration Type**
this option should be **Dynamic Library(.dll)** and build the solution/project now.
Rightclick on project name in solution explorer -> Add -> References -> Browse to path
where first_dll.dll is created and add the file
Using first_dll;
double var = Class1.sum(4,5);