调用64位C / C ++ DLL的C#应用​​程序崩溃,但运行32位版本

时间:2018-12-27 21:39:05

标签: c# c++ vb.net dll

我的C / C ++ DLL是为32位和64位Windows环境构建的。两位使用.NET(C#和VB.NET)工作的程序员说,当他们为32位构建客户端时,一切都可以正确运行。但是当它们针对64位进行构建时,运行会因访问冲突而结束。

我不是.NET程序员,但是我可以加载他们的进程,并逐步使用C ++调试器中的DLL代码。 .NET运行肯定会遇到损坏的内存,当客户端是我用C ++ / VCL编写的客户端时,这种情况不会发生。

我的问题:.NET项目设置中是否有一些特殊的东西与 64位 C / C ++ DLL进行接口连接,而与 32位下的工作方式不同?

可能相关,但我无法证明这一点:DLL是使用 Character Setting = Not Set 构建的,用于UTF-8 / ASCII。我不知道VB.NET客户端是否针对Unicode构建,但是我认为这样做会产生问题。

已从VB.NET,C#客户端和C ++ DLL编辑添加声明

Declare Function Edit_RunEdits Lib "EDITS50.DLL" (ByVal smfID As Integer, _
                                                  ByVal edit_set_tag As String, _
                                                  ByVal layout_tag As String, _
                                                  ByVal data As String, _
                                                  ByVal edit_options As Integer, _
                                                  ByRef errors_count As Integer, _
                                                  ByVal owner As IntPtr, _
                                                  ByVal callback_func As IntPtr) As Integer

这是C#声明:

[DllImportAttribute("EDITS50.dll", EntryPoint = "Edit_RunEdits")]
    public static extern int Edit_RunEdits(int smfID, 
         [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string edit_set_tag, 
         [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string layout_tag, 
         [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string data, 
         int edit_options, 
         ref int errors_count, 
         System.IntPtr owner, 
         System.IntPtr callback_func);

这是C ++方面:

#define EDIT_API  __declspec(dllexport) __stdcall
extern "C" int EDIT_API Edit_RunEdits( const int smfID, const char* edit_set_tag, 
const char* layout_tag, 
const char* data, 
const int edit_options, 
int* errors_count, 
void* owner, 
void* callback_func);

1 个答案:

答案 0 :(得分:0)

我相信我可能已经找到问题了。该项目是为AnyCPU构建的,但在x64设置下,Prefer32Bit设置为“ true”。我要求.NET程序员尝试为x64显式构建,并查找和覆盖Prefer32Bit的所有实例(将它们设置为“ false”)。

谢谢大家,您的反馈意见。