问题标签 [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 回答
1116 浏览

c# - 如何将 C++/CLI 程序编译成 .lib 并将其与纯非托管 C++ 程序链接?

我正在关注这个http://www.codeproject.com/Articles/10020/Using-managed-code-in-an-unmanaged-application

该示例由 3 个二进制文件组成:

  1. C# 代码
  2. C++/CLI 代码
  3. C++ 代码

C++ 代码调用 C++/CLI 代码,然后调用 C# 代码,以实现从 C++ 运行 C# 代码的方式。

问题是,C++/CLI 编译为 .dll,当我尝试将其编译为 .lib 时,使 C++ 代码与 C++/CLI 代码链接在一起,它失败了。

这样最终结果将仅包含 2 个二进制文件。

  1. C# 代码
  2. C++ --LINK-- C++/CLI 代码

错误

0 投票
2 回答
659 浏览

.net - 如何显示混合模式程序集的版本号是 Windows 资源管理器?

有没有办法在 Windows 资源管理器中显示混合模式程序集的程序集/文件版本?我正在尝试调查一些版本控制问题,如果我可以只看一下程序集的版本号,它会快得多。

0 投票
2 回答
3215 浏览

c# - 外部组件已从第三方程序集抛出异常

我们使用与打印机设备接口的第 3 方混合模式程序集。

在我们的一个应用程序中,程序集正常运行。

在另一个应用程序中,它正在生成以下异常:

经过一番研究,我发现我可以在 app.config 文件中添加以下内容来解决这个问题:

(运行的应用程序在其 app.config 中已经有此设置)

尽管这确实解决了“混合模式组装”问题,但现在我看到了一个有些不同的问题:

奇怪的是,我有一个应用程序可以正常工作,而另一个应用程序不能正常工作。他们都通过相同的代码(这是我们的另一个程序集)调用第三方程序集。

我尝试创建一个非常简单的测试应用程序,它使用相同的代码路径调用第三方程序集,但它也因“外部组件引发异常”错误而失败。

我比较了所有应用程序的 app.config 文件,它们基本相同,并且我仔细检查了每个应用程序的所有构建设置是否相同。这两个项目都针对 .NET 4.0 和 X86。

这两个应用程序显然有些不同,但我无法确定它是什么。

开发环境为 Visual Studio 2010。

有人对我可以调查的其他领域有什么建议吗?

0 投票
2 回答
1034 浏览

.net - 混合模式 C++/CLI 应用程序未正确关闭 CLR

我的混合模式 MFC 应用程序正在创建错误的内存泄漏,因为在 MFC dll 关闭之前 CRT 没有时间关闭。

我有一个非常简单的小应用程序可以显示问题:

用 编译cl.exe /clr test.cpp。运行时,您会得到:

问题的症结在于:之前声明的任何静态/全局变量gJamsUpTheCRT都不会被释放。例如,在我的例子中,MFC CWinApp 派生类没有被清理。

这是预期的行为吗?我想让我的应用程序完全关闭。

谢谢,

0 投票
1 回答
408 浏览

c++ - 从 c++/cli 实例化本机 c++ 代码结构的指针时出错

下面提到的是我的 c++/cli "*.h" 文件

我已经为这些原生 c++ 结构 rmsReqInfoStruct、rmsClientInfoStruct、rmsPhysicianInfoStruct、rmsReqPolicyInfoStruct、rmsAddlOrderInfoStruct 声明了指针。当我编译这个时,我得到了下面提到的这些错误,我不知道为什么我会得到这些

所有这些错误都出现在类私有声明本身的结构指针上,我无法弄清楚它们为什么会导致。任何人都可以帮忙。

0 投票
2 回答
1352 浏览

c# - 在托管和非托管代码之间共享图形对象时丢失抗锯齿

在原生 C++ 和 C# 之间传递 Graphics 对象

我目前正在开发一个类似于 Paint .NET 的应用程序。我有多种类型的层,它们是用 C# 实现的。这些图层被绘制到由 WinForms 用户控件提供的 .NET Graphics 对象中 - 它类似于 WPF 画布控件。layer 基类有一个 Draw 方法,实现如下:

对于性能和反编译问题,我正在混合模式程序集中进行图层组合,因为我还应用了斜角或阴影等效果。包装器,当然是用 C++/CLI 编写的,直接从画布控件调用,并将每个层的元数据和目标图形对象(来自我的 C# 编写的画布用户控件的图形对象)转发到本机 C++ 类。

C++/CLI 包装器:

本机 C++ 渲染器:

到现在为止还挺好。上面的代码几乎可以按预期工作,但是......

问题

唯一的问题是,例如,在渲染带有阴影的 PNG 时,我当前的实现缺乏抗锯齿和半透明。所以我只有 2 个 Alpha 通道的值:255 的透明或完全可见的颜色。这种副作用使得使用 Alpha 通道和字体绘制 PNG 看起来非常难看。当我使用纯 C# 代码时,我无法再像以前那样获得同样平滑和漂亮的半透明抗锯齿。

但是:直接在原生 Graphics 对象中绘制字符串时,

抗锯齿和半透明功能回归了。所以这个问题只有在将 Graphics HDC 传递给 .NET 时才很明显。

问题

这个问题有什么解决方案/解决方法吗?我尝试直接在 C# Layer 类中创建位图,并将 HBITMAP 的 IntPtr 返回到本机代码。这种方法是有效的,但在这种情况下,我遇到了另一个问题,因为我找不到将 HBITMAP 转换为具有 alpha 通道的 GDI+ 位图的完美解决方案(绘制字体时,边缘周围有白色像素噪声)。

感谢您的输入!:)

演示解决方案

附上你会在这里找到一个演示解决方案:Sources

在这个演示解决方案中,我测试了 3 种不同的渲染方法(全部在 NativeRenderer.cpp 中实现),而第一个显示了所描述的问题:

演示输出

1) RenderViaBitmapFromCSharp() - a)在 C++ 中创建一个新的位图,在 C++ 中创建一个新的 Graphics 对象,通过传递 C++ Graphics 对象调用 C# 绘图代码 HDC -失败

但是: b)直接从 C++ 绘图也可以通过创建的位图工作

2) RenderDirectlyFromCSharp() - 从 C++ 中的 C# Graphics 句柄创建一个新的 Graphics 对象,通过传递 C++ Graphics 对象 HDC 调用 C# 绘图代码 -工程

3) RenderDirectlyFromCPP() - 从 C++ 中的 C# 图形句柄创建一个新的图形对象,直接在 C++ 中绘制文本 -工作

0 投票
0 回答
188 浏览

c# - 从混合模式应用程序中访问 PageSettings 时,打印机 DLL 被多次加载/卸载

当我在托管应用程序中运行此代码时,一切正常。但是,在混合模式(C# 和 C++)应用程序中,当访问Landscape属性(或settings对象的任何其他属性)时,打印机驱动程序 DLL 会被多次加载和卸载,这会导致代码比托管代码慢得多应用。输出包含几十行,如下所示:

我能做些什么来防止这种“浪费”吗?

0 投票
1 回答
740 浏览

c++-cli - 如何从 dll 中导出原生类(即 protobuf 生成的类)

我正在尝试在 C++/CLI 中编写一个包装 dll 以在 c# 中使用一些本机类。

为了测试,我创建了另一个使用 dll 的 C++/CLI 项目。

我的问题是,我想在测试项目的 dll 项目中使用本机类之一,但链接器抱怨它没有找到此类成员的符号。我想这是因为未定义本机类ref public。由于本机类代码是由 Google Protobuffers 编译器自动生成的,因此我无法添加ref public它。

不要误会我,我不想在以后的c#项目中使用这个native class但是我想在Test项目中直接访问它。

0 投票
1 回答
172 浏览

php - 直接来自 C/C++ 语言的 PHP 响应

我正在寻找一种有效的方式来响应 http 请求。当收到http请求时(apache/php webserver环境),我想知道是否可以在c++库方法中获取对php响应实例的引用,并将输出数据直接写入C++上下文中的响应实例。

0 投票
1 回答
867 浏览

.net-4.0 - 如何调试在 InitInstance 之前崩溃的 C++/CLI MFC 应用程序

我使用 MFC(主要)和 COM 构建了这个可怕的 C++ 应用程序。它链接到几个库并进行大量科学计算。因此,现在我想为其添加一些新功能,作为一项组织策略,我们正在使用 .NET 开发所有新功能。因此,这个新的 UI 功能将使用 WPF 构建,并将在这个现有的 C++ 应用程序中使用。

我知道如何在 C++ 应用程序中使用 WPF 控件,所以这不是问题。问题是当我尝试在这个项目上打开 CLR 时,在链接阶段需要很长时间(大约 10 分钟)来执行链接并生成混合模式可执行文件。最后,它设法这样做并成功创建了可执行文件。但问题是每当我启动这个可执行文件时,它都会崩溃。我试图调试 InitInstance 但它在此之前的某个地方崩溃了。我对接下来要尝试什么感到有些困惑。

有没有人知道这可能是什么原因。

混合模式程序集的目标框架是 4.0(应该是)所以这不是这里的问题。

仅供参考,ILDasm 也无法加载此 exe。这需要很多时间,没有错误,但它也不会加载它。这给我的印象是没有正确创建以某种方式管理的图像。