问题标签 [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 投票
2 回答
107 浏览

interop - 检查 .NET 句柄的值 ^

这是我的情况:

我在 C++/CLI 层中有 .NET 包装对象,它保存指向非托管 C++ 对象的指针。我已经实现了终结器,以便它删除垃圾收集上的包装对象指向的非托管内存并将指针设置为空。

这是问题所在

我正在查看 .NET 包装器对象的终结器,它被调用两次并尝试两次删除相同的内存,这表明我以某种方式创建了 2 个超出范围的 .NET 包装器对象,并且被垃圾收集虽然我仍然希望包装器对象在范围内(这些包装器对象正在传递给 VB.NET 应用程序)。

这是我的问题:

无论如何我可以检查句柄值,以便我可以确认包装对象的创建位置(复制或其他)?目前我正在查看句柄值(EG - 0x0014fe80),但我看到创建对象、添加到集合和删除对象时的 3 个不同值。所以我不确定GC是否只是在移动东西并且这是同一个对象,或者我是否真的看到3个不同的对象引用了相同的非托管内存。如果可能的话,我想解决重复的对象副本,但我知道我可能想要实现某种智能指针,这样就不会发生这种情况。

谢谢,伊恩

0 投票
1 回答
846 浏览

.net - 为混合模式应用程序禁用并发 GC

设置:我有一个非托管/本机 Win32 应用程序,我将代码注入其中。我的代码主要是托管的,用 C++/CLI 编写并编译为 DLL。我的加载器/注入器修补了应用程序的 crt0 启动代码(基本上将对入口点函数的调用与对 LoadLibrary 的调用交换)。在附加到宿主进程时,DLL 将几个组件 DLL 加载到内存中(注入的 DLL 本身是用非托管代码编写的,只有组件 DLL 是托管程序集)并修补各种内存位置以充当组件 DLL 的接口。

现在,我在组件 DLL 中的代码似乎触发了内存泄漏 [如C++/CLI 中的正确对象处理中所述],我一直在研究在 .NET 内存探查器工具的帮助下对其进行调试。不幸的是,我不寻常的环境阻碍了该工具的充分使用。尝试将分析器附加到进程会导致它报告已为该进程启用了并发 GC,这会阻止它使用其内部 API 来跟踪引用等。

我试图创建一个配置文件来禁用该 GC 模式,但它似乎没有效果 - 探查器继续显示错误消息(我假设这是因为主机应用程序主要是本机的,因此不会在启动时解析配置文件)。我也尝试过修改 machine.config 文件,但徒劳无功。

是否有其他方法可以强制禁用并发垃圾收集器?

0 投票
1 回答
970 浏览

c# - 用于检测混合模式应用程序中的内存损坏的工具

谁能推荐一个免费或商业工具来检测 C# 4.0 应用程序中的内存损坏(不是内存泄漏),该应用程序通过 C++/CLI 桥调用非托管 C++ 库?我们正在使用Redgate Ants,但它并非旨在帮助处理非托管代码(这是发生内存损坏的地方)。谢谢。

0 投票
2 回答
1547 浏览

c++ - 从 C++ 访问汇编语言

这是我的编程任务。我需要使用用 8086 编程语言编写的方法找出整数数组中的最大值。这是我的尝试:

预期的答案是

1 2 3 4 5 6 6. 但我得到的是:在此处输入图像描述

在这里,我坐下来思考......不是数组的索引i处的值实际存储在内存中吗?因为至少我们被告知,如果 a[i] 是 12(比如说),那么第 i 个内存位置的内部写有数字 12。

或者如果该值没有存储在内存位置,我如何写入内存位置以完成所需的任务?

我还要求大家在网络/平装本上链接一些材料,以便复习这些概念。

编辑 :

汇编中的相同代码工作得很好......

0 投票
3 回答
3031 浏览

dll - 混合模式 C++/CLI DLL 在退出时抛出异常

我创建的 C++/CLI 混合模式 DLL 有问题。当使用它的 .NET 应用程序退出时,它会在卸载时引发异常。执行后DLL_PROCESS_DETACH,DLL 使用自动注册的函数进行运行时清理,atexit() / __onexit()并引发以下异常:

我已将问题追溯到atexit()由静态提升异常对象注册的调用get_static_exception_object()

我在大多数情况下都使用静态链接的 boost_1_47,除了动态链接的 boost::thread 以避免加载器锁定。我也尝试过动态链接所有没有帮助的提升。#pragma unmanaged此外,所有的提升包括都被块包围。

我希望有人遇到过类似的问题或知道解决方案吗?

谢谢,马克

这是异常发生之前的调用堆栈:

0 投票
4 回答
831 浏览

php - 将 PHP 和 HTML 代码加载到在

这是我的情况。我有以下脚本:

根据 $_GET['request'] 的值,我将 php 文件的内容分配给变量 $right_column。然后,我在最后一个 div 中回显该变量。firstPage.php 和 secondPage.php 文件包含混合的 html 和 php 代码。我在 Zend 中寻找像“部分”这样的解决方案。谢谢

0 投票
1 回答
1004 浏览

.net - 混合托管/非托管程序集加载顺序

我对混合 .NET 程序集(即混合托管/非托管 C++ 程序集)的 CLR 和 CRT 的初始化顺序有一些疑问。

因此,如果我有一个混合模式的程序集 dll 文件,并且它通过 Assembly.Load 加载。我注意到在首先调用某些托管代码之前,不会初始化或调用任何静态本机对象。好的。所以我认为在启动时首先初始化 CLR 代码,最后调用 CRT 初始化。关机顺序如何?CRT先关闭,CLR最后关闭吗?

事情是这样的吗?

还是以其他顺序?

我的问题也适用于可执行文件(即.exe)的混合模式程序集。是相似的吗?

0 投票
1 回答
1878 浏览

c# - 从类库加载混合模式 dll

所以我有一个混合模式的 dll,我想从我的 C# 类库中加载它。但我收到这个错误:

混合模式程序集是针对运行时版本“v2.0.50727”构建的,如果没有额外的配置信息,则无法在 4.0 运行时中加载。

所以我做了一些搜索,发现我应该将它添加到我的 app.config 中:

但是现在出现了问题,因为我试图从类库中加载混合模式 dll,所以我没有 app.config 文件。

我该如何解决这个问题?

0 投票
0 回答
391 浏览

.net - .NET 安装项目中的“混合模式程序集”

我正在使用 Microsoft.SqlServer.Smo 程序集的 VS2010 中构建 ac# 应用程序。

注意:由于某种原因,当我在 addReference->.NET 对话框中搜索此程序集时,我没有找到它,所以我不得不在 ProgramFiles(x86)->Microsoft SQL Server->90->SDK-> 中浏览它组件。

这个程序集在运行时导致“混合模式程序集”异常,所以我在网上搜索修复,发现我需要添加 App.Config 文件:

<startup useLegacyV2RuntimeActivationPolicy="true">
<requiredRuntime version="v4.0.20506"/> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup>

这解决了问题,但现在我有一个新问题。我为我的应用程序创建了一个安装项目,当我运行安装程序时,我再次遇到了相同的“混合模式程序集”问题。问题是我无法将配置文件添加到安装项目。我能做些什么??

0 投票
3 回答
1771 浏览

c++ - 在混合模式 DLL 中链接到 Presentationcore.dll

我们有一个用 C++ 编写的混合模式 DLL,它包装原生 C++ DLL 并公开托管类。在公开的托管类中,我们使用 Vector3D 等类型的方法参数,它们是 PresentationCore.DLL 的一部分。

因此,混合模式 C++ 代码需要引用 PresentationCore.DLL。我们通过

这需要项目的搜索路径包含 PresentationCore.dll 所在的文件夹。

这很糟糕,因为这些文件夹在不同的机器上有所不同,而且我们的项目需要在几台机器上编译而不需要更改。目前,我们已经通过在我们的代码库中包含一个 PresentationCore.dll 的副本来解决这个问题,这显然不是一个好的解决方案。

我将不胜感激建议我们如何绕过指定应该可以通过 GAC 完全访问的 DLL 的显式路径。