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

visual-studio-2008 - 混合模式 MFC 应用程序在 VS2008 中未正确初始化

我已将混合模式 MFC 应用程序从 VS2005 转换为 VS2008。它正在编译,但是在启动应用程序时,我在 afxwin1.inl 中得到一个断言,因为 afxCurrentResourceHandle = NULL。

这是在调用 MyCWinApp::InitInstance 之前。调用堆栈是

VS2005 中的同一个项目启动良好,我注意到调用 WinMainCRTStarup 而不是 PostDllMain 蜜蜂,它得到一个定义的实例句柄:

该应用程序使用 /clr 编译,并链接到托管、非托管和混合的库和 dll。

任何人都可以对这个问题有所了解吗?VS2005 和 VS2008 在这方面有什么已知的区别吗?

谢谢!

0 投票
5 回答
8182 浏览

.net - 混合模式 C++/CLR 应用程序中的内存泄漏

我在混合模式 C++/CLR .NET 应用程序中遇到内存泄漏缓慢的问题。

(它是链接到带有“/clr”编译器设置的 VS2008 C++/CLR Windows 窗体应用程序的 C++ 原生静态库)

典型行为:应用开始使用 30 MB(私有内存)。然后缓慢地泄漏内存,例如在模拟重负载下运行时每小时 1 MB。这模拟了应用程序运行数天或数周。

我尝试使用多种工具来追踪内存泄漏,包括 Visual Studio CRT 库附带的 CRT 调试工具。我还使用了商业泄漏检测工具(“Memory Validator”)。

两者都报告了在关机时可忽略不计的内存泄漏(我不担心的一些次要条目达到几 KB)。此外,我可以在运行时看到跟踪的内存似乎并没有那么多(所以我不相信它只是被持有的内存并且只在应用程序退出时释放)。我得到了大约 5 MB 的列出内存(总共 > 30 MB)。

该工具(内存验证器)设置为跟踪所有内存使用情况(包括 malloc、new、虚拟内存分配和一大堆其他类型的内存分配)。基本上,已选择要跟踪的内存的每个设置。

.NET 映像报告它正在使用大约 1.5 MB 的内存(来自 perfmon)。

这是最后一点信息:我们有一个作为本机控制台应用程序运行的应用程序版本(纯本机 - 根本不是 CLR)。这与混合模式 95% 相同,但没有 UI 内容。这似乎根本没有泄漏内存,并且在大约 5MB 私有字节时达到峰值。

所以基本上我在这里想要表达的是我不认为任何本机代码正在泄漏内存。

另一个难题:我发现这指的是针对 2.0 框架(我是)时混合模式应用程序中的内存泄漏:http: //support.microsoft.com/kb/961870

不幸的是,细节非常稀疏,所以我不确定它是否相关。我确实尝试过以 3.5 框架而不是 2.0 为目标,但仍然遇到同样的问题(也许我没有做对)。

有人有什么建议吗?

一些可能对我有帮助的事情:

  • 有没有我没有跟踪的其他类型的内存分配?
  • 为什么数字不加起来?我得到了 5 MB 的 CRT 内存使用量,1.5 MB 的 .NET 内存,那么整个应用程序怎么会使用 30MB 的私有字节呢?这一切都与.NET 框架有关吗?为什么我在泄漏工具中看不到这些?.NET 框架不会显示为某种分配的内存吗?
  • 任何其他与混合模式应用程序配合良好的泄漏检测工具?

谢谢你的帮助

约翰

0 投票
1 回答
3204 浏览

static - 与 gfortran 和 gcc 静态链接的混合语言

我有一些用 C 和 Fortran 编写的代码,我想编译成静态链接的可执行文件。如果我动态编译代码(使用-fno-underscoringgfortran 的选项),一切正常。不过,我想把它链接成一个.so文件,静态链接大部分需要的库,然后动态链接到libkrb5,很像这篇博文中描述的方法。

我按照上一篇博文中的步骤,成功地编译了 .so 库,没有任何问题。nm表明它状态良好,我的 Fortran 子例程和 C 函数出现了:

第一个函数是用 Fortran 编写的,第二个函数是用 C 编写的。它们没有下划线或任何东西,所以它们应该链接。我的主程序(在 Fortran 中)像其他 Fortran 源文件一样编译。但是,当我尝试链接时,出现错误:

collect2: ld 返回 1 个退出状态

main_program.o中,我可以看到有

一切看起来都井井有条,为什么它没有链接?

0 投票
1 回答
1018 浏览

.net - Mixed Mode C++ DLL function call failure when app launched from network share. Called from unmanaged c application

Mixed-mode DLL called from native C application fails to load: An unhandled exception of type 'System.IO.FileLoadException' occurred in Unknown Module.

Additional information: Could not load file or assembly 'XXSharePoint, Version=0.0.0.0, Culture=neutral, PublicKeyToken=e0fbc95fd73fff47' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)

My environment is: Native C application calling a mixed mode C++ DLL, which then loads a C# DLL.. This works correctly when loaded from a local drive, but when launched from a network drive, it fails with the above messages.

The call to LoadLibrary succeeds, as does the GetProcAddress. The load error happens when I call the function.

I have digitally signed the C application, and I've performed "strong name" signing on the 2 DLLs. The PublickKeyToken in the message above does match the named DLL. I have also issued the CASPOLcommands on my client to grant FullTrust to that strong name keytoken. When that failed to work, I tried the CASPOL command to grant FullTrust to the URL of the network drive (including path to my application's directory); no change in results.

I tried removing all dependencies, so that there was just the initial mixed-mode DLL... I replaced the bodies of all the functions with just a return of a "success" integer value. Results unchanged. Only when I changed it from Mixed Mode to Win32, and changed the Configuration Properties >> General >> Common Language Runtime Support from "Common Language Runtime Support" to "No Common Language Runtime Support" did calling the DLL produce the expected result (just returned the "success" integer return value).

0 投票
2 回答
2103 浏览

visual-studio-2008 - 如何从崩溃的混合模式 exe/dll 中获取完整的堆栈跟踪?

我用 C++/CLR 编写了一个应用程序。它使用本机 lib/dll。在极少数情况下,它会在本机 dll 内部崩溃。然后我得到一个堆栈跟踪,但仅限于托管部分,内部本机部分被排除在外。有没有办法让它显示整个堆栈跟踪?

我进行了以下测试:我在本机 dll 中添加了一行代码,使其始终崩溃。当我通过双击 exe 运行它时,我会像以前一样获得托管部分的堆栈跟踪。如果我从带有调试器的 VS2008 运行它(只需按 F5),它就会崩溃,我会看到整个堆栈跟踪、托管和非托管部分。

由于实际的错误很少发生,我想在我的应用程序中添加一些东西,以某种方式显示整个堆栈跟踪,而无需用户通过 VS 安装和运行它。有没有办法做到这一点?

谢谢马克

0 投票
2 回答
144917 浏览

.net - .NET 4 配置中的“useLegacyV2RuntimeActivationPolicy”有什么作用?

在将使用 SlimDX 并因此具有非托管代码的项目转换为 .NET 4.0 时,我遇到了以下错误:

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

谷歌搜索给了我解决方案,即将它添加到应用程序配置中:

我的问题是,在useLegacyV2RuntimeActivationPolicy做什么?我找不到任何关于它的文档。

0 投票
3 回答
2748 浏览

.net - .NET 混合多文件程序集

我需要创建一个由 2 个模块组成的 .NET 程序集:1 个带有本机代码的内部(在 DLL 中)和 1 个外部(在 .netmodule 文件中)。

这很容易做到,除了原生部分。

C# 的编译器可以做到这一点(这是我想要的,但使用本机代码):

C++ 编译器/链接器会将所有内容放在 1 个内部模块中。

汇编链接器仅执行外部模块:

我也尝试过手动调整 IL,但 ILDASM 和 ILASM 似乎无法往返本机代码:


为了澄清,我想要的是:

0 投票
2 回答
1051 浏览

visual-studio-2008 - 如何确定哪些 C/C++ 对象使用最多的内存

我有一个混合模式应用程序(托管和本机),它具有很高的内存占用。我已经发现大部分内存是由本机代码分配的。我不是在谈论内存泄漏,而是在程序启动后很早就发生的高内存消耗,然后相对稳定。

您是否知道有任何工具可以显示哪些 C/C++ 对象使用最多的内存?我已经尝试过 DebugDiag 1.1 和 SoftwareVerify 的内存验证器,但是这两个工具都没有提供足够的信息来识别 C/C++ 对象。

问候

坦率

0 投票
2 回答
3461 浏览

c# - 本机 C Dll 调用 C++/CLI 混合模式 Dll - 未处理的异常

我有一个由旧应用程序动态加载的 Native C Dll。此 dll 的目的是允许基于某些应用程序事件覆盖应用程序行为。我有一个 C# dll,其中包含我通过混合模式 C++/CLI dll 从本机 C dll 调用的函数,以增强这些应用程序事件。使用这种架构的应用程序可以在 Windows 2000 上完美运行。

该应用程序也可以在 Windows XP 上运行,但不幸的是,一旦在应用程序启动时加载了 Native C dll,应用程序就会崩溃(未处理的异常)。它似乎在尝试加载混合模式 dll 时崩溃。我已经从 Native C dll 中删除了对混合模式 dll 的所有依赖项,并且应用程序可以正常启动。但是一旦添加了依赖项,就会发生崩溃。Windows 2000 上的代码与 Windows XP 上使用的代码相同。我无权访问应用程序代码,但可以访问本机 C dll 代码,但无法让调试器停止,因为在初始化完成之前发生崩溃。我怀疑这与 CLR 初始化和操作系统加载程序差异有关,但不确定。我正在寻找有关如何解决此问题的建议。我正在使用 VS2005 使用 2。0 框架。感谢您提供的任何帮助。

异常和堆栈跟踪并没有真正的帮助:

MyApplication.exe 中 0x775125f6 处未处理的异常:0xC0000005:访问冲突读取位置 0x775125f6。

...

0 投票
2 回答
4078 浏览

c# - 如何从 Win32 进程调用 .NET DLL?

在 Win32 进程中使用 .NET DLL 时有哪些选择?我需要基本上使用 Win32 进程中的 C# DLL。

我现在有一个可能的解决方案,需要将 C# DLL 添加到 GAC(使用 RegAsm.exe),然后通过 COM 包装调用调用 C# DLL。但是,该解决方案非常繁重。它要求将 .NET DLL 添加到应该运行此 Win32 进程的所有计算机上的GAC 。

RegAsm在能够使用 C# DLL 之前不必调用就可以做到这一点吗?