我的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);
答案 0 :(得分:0)
我相信我可能已经找到问题了。该项目是为AnyCPU构建的,但在x64设置下,Prefer32Bit设置为“ true”。我要求.NET程序员尝试为x64显式构建,并查找和覆盖Prefer32Bit的所有实例(将它们设置为“ false”)。
谢谢大家,您的反馈意见。