问题标签 [mixed-mode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1157 浏览

linker - 我需要将我的混合模式应用程序链接到哪些库?

我正在将 .NET 支持集成到我们的 C++ 应用程序中。
这是一个老式的 MFC 应用程序,有 1 个额外的文件使用“/clr”选项编译,该选项引用 CWinFormsControl。

我不允许删除链接器标志“/NODEFAULTLIB”。
(我们有自己的构建管理系统,而不是 Visual Studio。)
这意味着我必须指定所有必要的库:VC 运行时和 MFC。

其他编译器选项包括“/MD”

接下来:我不能使用链接器标志“/FORCE:MULTIPLE”而只是添加所有内容
我正在寻找一组不重叠的库。

0 投票
1 回答
1142 浏览

.net - 在混合的托管/非托管进程中转储 CCW 和 RCW

我有一个混合的托管/非托管环境(Visual Studio 和 ReSharper),我怀疑 CCW 或 RCW 泄漏。有没有办法转储所有当前分配的包装器并识别它们的源/目标?我有 WinDbg、SOS 和 SOSEx,所以我可以使用 !syncblk 命令查看 RCW 和 CCW 的总数。我只想查看对象,所以我可以对它们调用 !gcroot 并检查嫌疑人。

0 投票
5 回答
2848 浏览

mixed-mode - 混合模式库和 CRT 依赖项 - 帮助

好吧,在进行了大量研究并尝试了几乎所有我能找到的托管 CPP Redist 以及尝试将我的 DLL 本地复制到应用程序的执行目录之后,我无法弄清楚这个混合模式库缺少哪些依赖项。

基本上我有一个大型 C# 应用程序,我正在尝试使用我制作的混合模式库。在开发机器上它可以完美运行(当然),但是在需要加载库以使用它时部署它,因为缺少 CRT 依赖项(我假设)。

我已经使用依赖遍历器检查所有引用的 DLL,并确保它们存在于部署机器上,但没有运气,我想知道是否可能缺少一些需要注册的依赖项,但我不知道是什么.

当代码尝试从混合模式库中实例化一个类时,出现以下异常。

异常详细信息:System.IO.FileLoadException:无法加载文件或程序集“USADSI.MAPI,版本=1.0.3174.25238,文化=中性,PublicKeyToken=null”或其依赖项之一。此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。(来自 HRESULT 的异常:0x800736B1)

我正在使用指定了 /clr:oldSyntax 的 VS2008 SP1 编译库。

中间清单如下所示:

我可以根据需要提供更多信息,不幸的是我并不精通制作混合模式库,所以这让我很失望。

如果有人可以提供任何建议,我将不胜感激!

0 投票
5 回答
12941 浏览

.net - 如何在混合(C#/C++)调试中设置数据断点?

我在 C# 中启动我的程序,然后调用一些非托管 C++。

当我在非托管 C++ 中换行时,“新数据断点”菜单项显示为灰色。

有没有办法解决?

0 投票
3 回答
3748 浏览

c# - 创建从 C 到 C# 的混合模式 C++ 桥?

我希望有人可以帮助我,我主要是 C# 开发人员,所以我的 C 和 C++ 技能很差。我有一个本机 C dll,它是一个更大的应用程序的插件。我使用 gcc 为 linux 上的 windows 交叉编译了这个 dll。

在本机 dll 中,当我创建 D3DSurface 时,我想在混合模式 C++ dll 中调用一个函数,并将指向表面的指针与 Hwnd/句柄一起传递。然后,混合模式 C++ 应该调用我的 C# 托管代码。

举个例子,在 CI 中想要做以下事情;

在 C# 中,我希望从混合模式程序集中调用它

由于我不擅长 C++,我只想知道是否有人可以给我一个示例,说明我需要为混合模式 dll 编写什么代码。我也不想编译带有directx头文件的混合模式dll,那么有没有办法可以将'C' LPDIRECT3DSURFACE 转换为通用指针?在 C# 中我只是使用 IntPtr 。

0 投票
4 回答
4577 浏览

c++ - 使用 /clr:pure 项目中的混合 DLL

我正在与 Dll 一起构建一个项目。

Dll 必须支持本机代码,因此我将其声明为 /clr。我的项目最初也是一个 /clr 项目,一切都很好。但是我想包含一些 NUnit 测试,所以我不得不将我的主项目从 /clr 切换到 /clr:pure。

一切仍然可以编译,但任何 Dll 调用都会产生运行时错误。当我恢复到 /clr 时一切正常

在我的 Dll 中,导出的函数声明如下:

我还制作了一个 .def 文件,其中包含所有导出函数的真实名称

在我的主要项目中,我的进口声明如下:

有人遇到过这样的问题吗?

0 投票
6 回答
5024 浏览

c++ - Visual Studio:std::string 的乱码调试监视?

当我在 Visual Studio 2005 中调试 C++ 混合(托管/非托管)项目时,我经常从调试手表中得到奇怪的数据,如下所示:(
顺便说一句,变量i_processName是 a const std::string &

替代文字 http://img175.imageshack.us/img175/3561/43419953av1.jpg

请注意,该变量实际上包含有效数据 - 如果我将其打印到标准输出,打印的字符串就可以了,感谢您的询问。更简单的数据类型(例如ints)(通常?)会显示正确的值。

这也发生在你身上吗?

这是调试时的主要 PITA,所以......关于如何让手表显示正确数据的任何想法,或者是什么原因造成的?

0 投票
4 回答
1095 浏览

c++ - 帮助对混合模式 Win32 应用程序进行事后调试

情况如下:

背景

我有一个在 Visual Studio 2008 中开发的混合模式 .NET/Native 应用程序。

我所说的混合模式是指前端是用 C++ .NET 编写的,它调用本机 C++ 库。本机代码在应用程序中完成大部分工作,包括根据需要启动新线程。.NET 代码仅用于 UI 目的(赢取表单)。

我有一个在测试人员的计算机上运行的应用程序的发布版本。

本机库经过全面优化编译,但也启用了调试(“调试信息格式”设置为“程序数据库”)。

这意味着我在 PDB 文件中有应用程序的调试符号。

问题

所以无论如何,其中一位测试人员遇到了应用程序问题,它偶尔会在 XP 上崩溃。我已经能够使用 Watson 博士多次运行获得崩溃的小型转储。

当我调试它时(使用 minidump - 我实际上并没有调试真正的应用程序),所有调试符号都正确加载:我可以正确看到所有本机线程的完整堆栈跟踪。其他线程(可能是 .NET 线程)没有堆栈跟踪,但它们至少都向我显示了线程是在哪个 dll 上启动的(即 ntdll.dll)。

它正确报告失败的线程(“用户(5).dmp 中 0x0563d652 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000)。

但是,当我进入线程时,它显示没有任何用处。在堆栈跟踪中有一个条目,它只有内存地址“0563d652()”(甚至不是“ntldll.dll”)。

当我进行拆卸时,它只显示大约 30 条指令的随机部分。内存地址的任何一侧都只是“???”。它几乎看起来不是我的源代码的一部分(您的二进制文件不是按顺序加载到内存中吗?在中间有一组随机的汇编语句是否正常?)。

我的问题

所以基本上我的问题是三次的。

1)任何人都可以解释调试器缺乏信息吗?

2)请记住,我无法显示我的代码中发生的错误,任何人都可以提出失败的原因

3) 我可以做任何其他事情来帮助我在未来诊断当前的问题吗?

帮助!

约翰

更新:

这是来自 WinDBG 的失败线程的堆栈转储

很奇怪吧?甚至不显示 DLL。

是否有可能我已经以某种方式破坏了堆栈/堆,导致线程刚刚被破坏......?

0 投票
1 回答
88 浏览

shared - 在 Linux 代码中混合不同版本的库

我正在处理的程序静态链接到 3rdPartyLibrary.lib。

我们想利用相同 3rdPartyLibrary 的更新版本,例如 3rdPartyLibraryNewVersion.lib。

因此决定将 3rdPartyLibraryNewVersion.so 包含为动态链接库,通过名为 wrapper.so 的包装动态库包含。我们希望同时使用 3rdPartyLibrary 的新版本和旧版本,但在程序的不同方。

我们的解决方案是静态链接旧的 3rdPartyLibrary,同时将包装库动态链接到 3rdPartyLibraryNewVersion。

程序---静态链接---> 3rdPartyLibrary.lib。--- 动态链接 --> wrapper.so --- 动态链接 ---> 3rdPartyLibraryNewVersion.so。

这可能吗?

我们遇到的问题是,当 wrapper.so 使用测试可执行文件时,当从静态链接到 3rdPartyLibrary.lib 的程序调用包装器时,它在 3rdPartyLibraryNewVersion.so 内失败。

我做错什么了吗?

我知道正确的方法是将我们的代码更新为 3rdPartyLibrary.lib 但这太乏味了......

谢谢,

蒂姆

0 投票
2 回答
2410 浏览

.net - 托管 C++ .NET 应用程序中未处理的托管异常的访问冲突问题

这实际上是一个已解决的问题,但它是如此深奥,我想我会与其他用户分享它。

也许其他人可能会提出原因?

无论如何,我正在开发一个用托管 C++ 编写的“混合模式”.NET 应用程序,但与现有的本机库有大量链接。

问题是,未处理的托管异常最终成为 Win32 访问冲突。我的意思是,我不会显示带有未处理托管异常的漂亮 .NET 对话框,而是会收到旧样式的“未处理的 win32 异常发生在...”消息。

有趣的是:如果我在调试器中启动应用程序,那么抛出的托管异常会被正确拾取。即,调试器向我显示了这条线。

但是,当正常执行时,它会变成这种访问冲突。在那个时候附加调试器会产生很少的有用信息(它甚至不会显示合理的堆栈跟踪)。

因此,对我来说,这表明在未处理的托管异常到达异常处理程序之前,本机代码中正在发生某些事情。

因此,无论如何,我通过将我的项目与 Visual Studio 2008 生成的全新 C++ 托管项目进行比较,设法解决了这个问题。

解决方法是执行以下操作:

  1. 将 /SUBSYSTEM 标志(项目属性->链接器->系统->子系统)/SUBSYSTEM:WINDOWS更改为“未设置”

  2. 从使用旧式 WinMain() 切换到使用新式 main()。

即它曾经是

现在是

[为什么我使用这个奇怪的_tWinMain?这是多年前 Visual Studio .NET IDE 在您创建示例混合模式 Windows 应用程序时生成的。它一直运行良好(直到现在),所以我从不费心改变它。_tWinMain 只是 WinMain 的一个宏]

我做了这个改变,问题就消失了。未处理的 .NET 异常现在可以正确捕获,因此我现在可以实际调试它们。

我还对干净的示例 C++ 应用程序进行了反向更改,并证明这是原因。

所以,我的问题是,到底发生了什么?

只是我使用的是旧风格的 WinMain 而不是新的main(array <String^>^)

我是否应该将此报告给 Microsoft(有人会关心 ;-))吗?