Winforms 64位ATL控件不适用于VC++;表单应用程序

Winforms 64位ATL控件不适用于VC++;表单应用程序,winforms,visual-studio,visual-c++,com,atl,Winforms,Visual Studio,Visual C++,Com,Atl,我已在64位非托管dll中创建了ATL控件 我想在VC++WinForms应用程序中使用此控件 当我运行应用程序时,我得到了badimageformatexception 然后我创建了一个VB应用程序和一个C#应用程序。在这两种情况下,它都可以正常工作。 然后,我用微软提供的TstCon(MFC-64位)测试了我的控件。该控件被识别没有问题,我能够调用它的一些方法 我唯一无法使其工作的情况是VC++窗体(我使用VS 2010 pro) 我创建了一个小的测试示例 请从这里下载: ATL控件位于A

我已在64位非托管dll中创建了ATL控件

我想在VC++WinForms应用程序中使用此控件

当我运行应用程序时,我得到了badimageformatexception

然后我创建了一个VB应用程序和一个C#应用程序。在这两种情况下,它都可以正常工作。 然后,我用微软提供的TstCon(MFC-64位)测试了我的控件。该控件被识别没有问题,我能够调用它的一些方法

我唯一无法使其工作的情况是VC++窗体(我使用VS 2010 pro)

我创建了一个小的测试示例

请从这里下载:

ATL控件位于ATL_项目_64文件夹中。 它是一个简单的控件,有一个属性(Number)和一个事件(OnChange)。 从这里开始,我已经完成了所有步骤:

编译项目

然后,我创建了两个WinForms应用程序来测试控件。C#正在毫无问题地工作。 别忘了添加对Atl_project_64Lib的引用。如果在Com对象列表中找不到,可以将其浏览到创建dll的文件夹

然而,VC++项目不起作用。如果您尝试运行badimageformatexception,您将得到它。当我按下设置属性值的按钮时,有时会出现错误

都是64位的

你知道我做错了什么吗

谢谢,
mihai

BadImageFormatException始终是程序使用位错误的DLL的可靠标志。在您的案例中,麻烦制造者是为C++/CLI项目中的ActiveX控件生成的互操作库。这是您将看到在其上运行corflags.exe的内容:

C:\projects\atl\test_atl - VC++\x64\Debug>corflags Interop.atl_project_64Lib.1.0
.dll
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 3
ILONLY    : 1
32BIT     : 1
Signed    : 0
请注意,32位标志已打开,此处为kaboom。当您在C++/CLI项目中添加对类型库的引用时,此问题开始出现。不幸的是,生成互操作库的工具(“托管包装生成器工具”)正在创建一个仅为32位的互操作库。除了虫子,很难再叫它别的了。我可以看到它是如何发生的,类型库也有一个(小的)位依赖关系

通过自己运行Tlbimp.exe而不是依靠IDE出错来修复此问题。你已经有了一个很好的互操作库,顺便说一句,C#项目中的那个库是合适的,并且关闭了32位标志。顺便说一句,这个项目有些奇怪,互操作库被卡在了obj目录中。不知道是怎么发生的,看起来不像