【问题标题】:Calling a function from a Win32 .lib project with /clr from a project that is a pure Win32 project, no clr从纯 Win32 项目的项目中使用 /clr 从 Win32 .lib 项目调用函数,没有 clr
【发布时间】:2010-10-22 05:12:03
【问题描述】:

我想知道如何从不支持 clr 的 ProjectB::ClassB::FuncB() 中准确调用 ProjectA::ClassA::FuncA() 中的函数,该函数是带有 /clr 的 Win32 .lib并且是一个纯Win32项目。 这两个项目都在同一个解决方案下。

首先,这是我尝试过的: 1. 使用 .lib 创建 ProjectA 2. 将.lib 路径添加到 ProjectB 属性(在 Linker:Input:Add.Dependencies 中) 3.我在ProjectB中为ProjectA创建的.lib添加了.h 4. 在 ProjectB::ClassB 中为 ProjectA::ClassA 创建对象并尝试调用 FuncA()。

我收到以下错误:

错误 1 ​​错误 LNK2019:无法解析的外部符号“public: static void __cdecl ClassA::FuncA(void)” (?FuncA@ClassA@@SAXXZ) 在函数“public: static void __cdecl ClassB::FuncB(void)”中引用" (?FuncB@ClassB@@SAXXZ) Helper.obj

我在 ProjectB 中成功使用了第三方 .lib 。我遵循相同的过程,但失败了;唯一的区别是 ProjectA() 是 CLR 支持。

我错过了什么吗?请赐教;-)

谢谢!

【问题讨论】:

  • 您是否必须有 CLR 支持才能调用托管程序集。
  • @rerun:我在 ProjectA (.lib) 中支持 CLR,我在 ProjectB 中使用它。所以,ProjectA 有 CLR 支持,ProjectB 没有。 ProjectA 仍然是 Win32 项目,只是我添加了 CLR 支持。

标签: .net c++ winapi interop clr


【解决方案1】:

本机代码可以调用托管代码,但这需要在使用 /clr 编译的源代码文件中完成。您需要一个在 ProjectB 中原生的小适配器类(没有“ref”)。如果这些是实例方法,那么您需要在适配器中使用 gcroot<> 来存储对托管类的引用。

【讨论】:

  • 感谢您的信息。我可以从 ProjectB 调用在 ProjectA 中实现的托管函数 - 如上所述,两者都是 Win32 项目。但是,我现在遇到了另一个不寻常(相当常见)的情况(对我来说)。我在 ProjectA::ClassA 中有静态和非静态函数。我有一个 ProjectB::ClassB 对象,我想使用它来调用这些 ClassA 函数。我可以使用 ClassB 对象调用 ProjectA::ClassA 中的非静态/实例方法。
  • 但是我无法使用 ClassA:: 或 ClassB:: 的类名调用静态函数(Class ClassB:公共 ClassA 是我的子类化方式)。我是“Win32+CLR”和“Win32”之间互操作的新手。任何指针???我是不是公然遗漏了什么?
  • 可能静态函数更简单。我不可能猜到您缺少什么,您甚至没有包含错误消息。更新您的问题。
  • 对不起,错误是error LNK2001: unresolved external symbol "public: static void __cdecl ClassA::StaticFuncA(void)" (?StaticFuncA@ClassA@@SAXXZ) Helper.obj
猜你喜欢
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2012-08-15
相关资源
最近更新 更多