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

.net - Windows 能否找到不在路径、GAC 或注册表中的非托管 DLL?

如果这些 DLL 不在应用程序目录或 Windows 路径中,Windows 能否找到混合模式应用程序的非托管(非 COM)DLL?我注意到路径上没有出现 VS 2008,我想知道这是如何完成的。

0 投票
2 回答
1083 浏览

c# - C++ COM C# 混合模式互操作

我试图了解从非托管 C++ 调用 C# 库实现的选项。

我的顶级模块是一个非托管 C++ COM/ATL dll。我想集成现有托管 C# dll 的功能。我有,并且可以重新编译这两个库的源代码。

我从阅读MSDN 上的这篇概述之类的文章和这个 SO 问题中了解到,有可能创建一个“混合模式”dll,它允许本机 C++ 代码调用 C# 库。

我对这种方法有几个问题:

  1. 我该如何设置呢?我可以简单地更改现有 COM/ATL 项目的一些属性以允许使用 C# 模块吗?
  2. 这些混合模式调用与 COM 互操作调用的性能有何不同?是否有一种通用的字符串格式可用于防止模块之间的转换或深度复制?
  3. 如果这个 dll 是在混合模式下创建的,它的 COM 客户端是否仍然可以以相同的方式接口/使用它,或者它们是否需要了解混合模式?
  4. 加载此 COM 对象时,包含 CLR 是否会产生大量开销?

我是 Windows 开发的新手,所以如果问题陈述中的任何内容需要澄清或更正,请发表评论。

提前致谢。

0 投票
3 回答
384 浏览

.net - 我的应用程序不受管理。我从哪里开始引入托管代码?

我的整个应用程序(相当大,有 20MB 的可执行文件)是用非托管 C++ 编写的。因为我可以清楚地看到使用托管代码的优势,所以我想开始在我的应用程序中引入托管代码,但是从哪里开始呢?

我可以轻松开始使用 C++/CLI 并将其与我的应用程序的其余部分链接吗?(尽管 C++/CLI 语法看起来相当“异国情调”)。

还是迁移到 C# 更好,但是将它与我​​的非托管 C++ 代码“链接”在一起的最佳方法是什么?

使用 /clr 选项编译我的所有 C++ 代码是否有意义?这行得通吗?

我需要担心编组吗?这是否会产生开销,或者我可以在托管和非托管之间切换而不会降低性能(就像我 20 年前混合 fortran 和 C 时所做的那样)。性能在我的应用程序中非常重要,因为它是一个有时会处理数 GB 内存的科学应用程序。

还是只重新设计用户界面才有意义,只用 C# 编写它,并将我的应用程序的其余部分(计算逻辑、业务逻辑、数据库接口……)保留在非托管 C++ 中?

由于我的应用程序有时需要处理几千兆字节的内存,所以我有一个 64 位的变体。拥有 64 位托管代码容易吗?如果使用那么多内存,垃圾收集器是否仍然有效?

简单地说:我从哪里开始?

帕特里克

0 投票
2 回答
1337 浏览

.net-4.0 - 使用 Castle Windsor 从使用 .net 2.0 组件的 .net 4.0 应用程序获取“ComponentActivatorException”

我有一个正在 VS2010 中开发的应用程序,并通过配置文件使用 Castle-Windsor IoC。

我正在注册的组件之一,也是在 VS2010 中开发的,引用了一个 .net 2.0 组件(LeadTools),因此重新编译 2.0 项目不是一种选择。当包装组件的注册完成时,会引发“ComponentActivatorException”,它会包装“System.TypeInitializationException”,然后会包装“System.IO.FileLoadException”,并显示“混合模式程序集是针对版本'v2构建的”消息.0.50727' 的运行时,如果没有额外的配置信息,则无法在 4.0 运行时中加载。”

我已将运行时声明添加到应用程序的配置文件中,如下所示:

如果包装组件没有在 Windsor 中注册,这可以正常工作,但是,它似乎确实忽略了其他指令。

谢谢!

0 投票
1 回答
306 浏览

.net - 混合模式 C++ 应用程序的内存调试器

我必须维护一个大型 C++ 混合模式应用程序(VC++ 2005,CLR 支持:/clr:oldsyntax)。我怀疑该程序有许多内存泄漏,但很难手动找到它们。对于原生 C++ 应用程序,我们使用 Purify(以及 Linux 上的 Valgrind)。

不幸的是,Purify 不支持混合模式程序集。这里有人知道支持混合模式程序集的体面的内存调试器吗?

0 投票
4 回答
29851 浏览

asp.net-mvc - ASP.NET MVC 和混合模式身份验证

我有一个场景,我要求用户能够使用 Windows 身份验证或 Forms 身份验证对 ASP.NET MVC Web 应用程序进行身份验证。如果用户在内部网络上,他们将使用 Windows 身份验证,如果他们在外部连接,他们将使用 Forms 身份验证。我看到很多人问我如何为此配置 ASP.NET MVC Web 应用程序,但我还没有找到完整的解释。

请有人提供详细的解释和代码示例,如何做到这一点?

谢谢。

艾伦 T

0 投票
1 回答
1615 浏览

access-violation - 运行使用 /clr 构建的 DLL 的本机 C++ 应用程序时访问冲突

我正在重新组织一个旧的混合(托管和非托管 DLL)应用程序,以便主应用程序段是非托管 MFC,它将调用使用 /clr 标志编译的 C++ DLL,该标志将桥接托管(C# DLL)和非托管代码之间的通信. 不幸的是,我的更改导致在调用应用程序 InitInstance() 之前发生访问冲突。这使得调试非常困难。我得到的唯一信息是以下堆栈跟踪。

所以,这里有一些我试过的场景。
- 打开 Exceptions->Win32 Exceptions->c0000005 Access Violation 以在抛出时中断。我得到的最详细信息仍然来自上面的堆栈跟踪。我已经使用 F10 尝试了该应用程序,但它在任何断点被命中之前失败,并且由于上述堆栈跟踪而失败。

- 我已经删除了桥接 DLL,因此它只有一个返回布尔值的方法,并且该方法被编码为只返回 false(不调用 C# 代码)。

如果使用 /clr 标志编译已存根的 DLL,则应用程序将失败。如果编译时没有 /clr 标志,则应用程序运行。

- 我使用 Visual Studio 向导为多文档应用程序创建了一个存根 MFC 应用程序,并调用 DllPassthrough::IsFailed()。即使使用用于编译 DLL 的 /clr 标志,这也会成功。

- 我已经尝试在 winmm.lib 上执行手动 LoadLibrary,如下面的注释Access violation when using c++/cli中所述。应用程序仍然失败。

所以,我的问题是如何解决这个问题?任何提示、策略或以前的事件。而且,如果做不到这一点,我如何才能获得有关导致访问异常的代码段或库的更多信息?如果我尝试更多涉及的解决方法,例如进行 LoadLibrary 调用,我想将其缩小到失败的库。

谢谢。顺便说一句,我们使用的是 Visual Studio 2008,并且该项目是针对托管部分的 .NET 2.0 框架构建的。

0 投票
6 回答
19461 浏览

.net - C++/CLI 混合模式 DLL 创建

我有一个本机 C++ DLL,我想要一个 C++/CLI 包装层。据我了解,如果您简单地在项目中添加一个 C++/CLI 类,VS 将编译为混合模式,但我显然错了,因为 VS 似乎甚至没有触及托管代码。

那么,给定一个预先存在的本机代码库,您需要逐步创建混合模式 DLL,以便我可以从任何 .NET 语言链接到该代码

*我需要这样做,因为我的本机代码使用我无法 P/Invoke 的 C++ 类。

0 投票
2 回答
820 浏览

interop - 如何将 C++/CLI 代码的某些部分编译为 Native,而将某些部分编译为 Managed?

我正在调用 LoadTypeLib 以在 C++/CLI 中加载非托管类型库。我需要将一些代码区域编译为托管,将一些代码区域编译为非托管(本机),并形成一个混合模式类库作为可执行文件。

我需要托管和非托管(本机)哪一部分才能分别编译为托管和本机?

0 投票
2 回答
1959 浏览

.net - 托管和非托管 C++/MFC 可以混合在一个 dll 中吗?

以前,我们在 MFC (VC6)、VB6 和 C# 应用程序中拥有需要调用用 C++(和 MFC)编写的相同引擎的软件。引擎需要 C++ 来提高速度。当时我们决定使用 COM 作为接口,因为这三个都可以在编组等问题最少的情况下使用它。

我们的 MFC 应用程序现在已弃用,我们最近决定转储 VB6,所以剩下的就是 C#。

我们可以让 COM 引擎保持原样,但最好摆脱 COM 注册等,并拥有一个可使用的托管接口。如果此人的机器出现问题,COM 注册有时会导致支持问题。

是否可以使用现有的非托管 C++/MFC 和 .NET 前端接口来创建 dll?