我在64位非托管DLL中创建了一个ATL控件。
我想在VC ++ WinForms应用程序中使用此控件。
当我运行应用程序时,我得到了badimageformatexception。
然后我创建了一个VB应用程序和一个C#应用程序。在这两种情况下,它都没有问题。 然后我用微软提供的TstCon(MFC-64bit)测试了我的控件。控制被识别没有问题,我能够调用它的一些方法。
我无法使其工作的唯一情况是VC ++ Forms(我与VS 2010 pro合作)。
我创建了一个小测试示例。
请从这里下载:
https://rapidshare.com/files/2799321813/atl.zip
ATL控件位于atl_project_64文件夹中。 它是一个带有1个属性(Number)和一个事件(OnChange)的简单控件。 我已经按照此处的所有步骤进行操作:http://msdn.microsoft.com/en-us/library/599w5e7x.aspx
编译项目。
然后,我创建了2个用于测试控件的WinForms应用程序。 C#没有问题。 别忘了添加对Atl_project_64Lib的引用。如果在Com对象列表中找不到它,则可以将其浏览到创建dll的文件夹。
然而,VC ++项目无效。如果您尝试运行它,您将获得badimageformatexception。当我按下设置属性值的按钮时,有时会出现错误。
全部是64位。
你知道我做错了吗?
感谢, 米哈伊
答案 0 :(得分:2)
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
请注意,32BIT标志已打开,kaboom在那里。在C ++ / CLI项目中添加对类型库的引用时,就会出现此问题。不幸的是,生成互操作库的工具(“Managed Wrapper Generator Tool”)正在创建一个仅32位的互操作库。除了一个bug之外,很难称之为其他任何东西。我可以看到它是如何发生的,类型库也确实具有(小)位数依赖性。
通过自行运行Tlbimp.exe而不是依靠IDE来解决问题来解决此问题。你已经拥有了一个很好的互操作库,C#项目中的那个是正确的并且关闭了32BIT标志。这个项目btw有些奇怪,互操作库卡在了obj目录中。不确定是怎么回事,不看。