问题标签 [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.
asp.net-mvc-2 - 混合使用 WebForms 和 MVC:我应该如何处理 MasterPage?
我想开始将 WebForms 应用程序迁移到 MVC。这个过程将是渐进的,因此两个系统必须共存。
问题是:我是否应该有两个 MasterPage,一个用于 WebForms 页面,另一个用于 MVC 视图?有没有办法只有一个?
visual-studio - 如何调试非托管 BCL (InternalCall) 方法?
我想调试[MethodImpl(MethodImplOptions.InternalCall)]
BCL 方法的实现,该方法可能是用 C++ 实现的。(在这种特殊情况下,我正在查看 System.String.nativeCompareOrdinal。)这主要是因为我很爱管闲事,想知道它是如何实现的。
但是,Visual Studio 调试器拒绝进入该方法。我可以在这个调用上设置一个断点:
然后调出 Debug > Windows > Disassembly,单步执行 Equals 调用,然后单步执行,直到找到call
x86 指令。但是,当我尝试对其使用“Step Into” call
(我从 Reflector 知道是 nativeCompareOrdinal 调用)时,它并没有像我想要的那样进入 nativeCompareOrdinal 中的第一条指令——而是跨步,直接进入Equals 中的下一条 x86 指令。
我正在构建为 x86,因为 x64 应用程序不支持混合模式调试。我在“工具”>“选项”>“调试”中取消选中“仅我的代码”,并在“项目属性”>“调试”选项卡中选中“启用非托管代码调试”,但它仍然跳过call
. 我还尝试启动该过程,然后附加调试器,并显式附加托管调试器和本机调试器,但它仍然不会进入该 InternalCall 方法。
如何让 Visual Studio 调试器单步执行非托管方法?
c# - IIS 7.5 和混合模式身份验证(单点登录)
有没有人设法做到这一点?
应用程序应该像这样工作:
- 应用管理员可以添加 AD 用户
- 应用管理员可以定义不是来自 AD 的用户
- 如果用户是从 AD 添加并尝试从同一个 AD 访问应用程序 - 应用程序应自动让他登录(单点登录)。
- 如果用户不是来自 AD 或未添加为应用程序用户 - 将显示应用程序登录表单
顺便提一下,我设法在 IIS6 上实现了这一点。到目前为止,我已经阅读了几种涉及 IIS 7 和 7.5 的技术,但是当部署在生产服务器上时,它们似乎都没有真正起作用。
到目前为止,我有 2 个独立的 Web 应用程序。一个 Web 应用程序配置了表单身份验证 - 这是主要的。其他配置为windows认证。
所以想法是,用户尝试访问主应用程序,这个将他重定向到另一个尝试提取他的域用户名(NTLM)的应用程序,并将他重定向回主应用程序。主应用程序尝试将他作为 AD 用户登录,如果失败,则会显示表单登录。如果 AD 用户被添加为应用程序用户(使用应用程序的单独管理模块),他应该自动进行身份验证,这意味着不应显示 IIS 登录提示。
这两个应用程序在同一个应用程序池中运行。它们也都处于集成流水线模式。
如果我在我的开发 win7 IIS 上设置它,这可以工作,但是当我在带有 IIS 7.5 的 win 2008 服务器上部署应用程序时 - 它不起作用。我不断收到 IIS 登录提示。如果我在 IIS 登录提示中输入我的凭据,它最终会将我登录到应用程序中。
有没有人有类似的问题并希望解决它?
c++-cli - 将非托管 C++ DLL 与托管 C++ 类库 DLL 链接
我想在 .NET 中使用 C++ 类,但在 Visual Studio (2008) 中构建时遇到问题。
我有一个非托管类 A(用 /clr 编译的 C++)。我创建了一个 C++/clr 类“Class1”,它包装了 A 并使用匹配的方法委托给 A 的方法。
如果我在 Class1 的类库项目中包含类 A 的单元源文件(托管),我没有问题,所有链接都可以正常工作,但是我有许多非托管 C++ 类,如 A,我想将它们放入 DLL 并链接DLL 到托管库(类包装器)。[我实际上认为此时不需要将这些 DLL 链接在一起,但编译器似乎需要它,并给出如下所示的相同错误。]
我创建了 VisualC++ / CLR / 类库并添加了我的 C++ 类(下面列出的 A)并构建。[我使用了默认设置,但在项目链接器设置中,我尝试了使用 yes 和 no 注册输出。] 没有错误,并且创建了 .DLL 文件。
我创建了 VisualC++ / CLR / 类库并创建了包装类“Class1”,我使用了所有默认设置。在项目属性下,我单击“引用”“添加新引用”并选择在第一步中创建的 DLL。
我收到链接器错误:
与我在包装类库项目中删除 A.cpp 相同的错误(有效的选项)。我不明白为什么构建首先要尝试解决外部问题,因为这是一个库,而不是程序。
我还需要添加到包装类库项目属性或注册非托管类的 DLL 或编译器选项吗?我还需要一个 .lib 文件来与 DLL 一起使用吗?(项目目标目录中没有出现lib文件)
我是否仍然需要使用 __declspec(dllexport) [它认为这仅适用于 C 样式函数而不是类成员。] 如问题:Export Unmanaged Classes from a Visual C++ DLL? 即使非托管 C++ 库是在启用 CLR 的情况下编译的。
(我也尝试编译为静态库,但我不知道如何将 .lib 文件添加到 CLR 类库项目)。
我的测试课是
与实施:
包装类是
根据问题: C++/CLI Mixed Mode DLL Creation 我也尝试过:
而且这种推动也围绕 A.cpp 进行管理。
更新:根据 mcdave 的回复,我删除了 /clr 这产生了一个 DLL,现在如何使这个 DLL 可用于我的 test_NET_library?
我尝试了引用/添加新引用,并选择了新的这个新的 DLL;并收到消息“无法添加对文件 'C:..\unmanaged_lib.dll' 的引用,因为它既不是 .NET 程序集也不是注册的 ActiveX 控件。”。DLL 已添加到项目的文件列表中,但编译器似乎忽略了它。
我尝试了添加/现有项目并选择了新的 DLL。但 .DLL 文件不是可选择的文件类型。
visual-c++ - 如何将 C++ 本机对象编组到托管 C++ CLI
我有一堆本机 C++ 对象和类,其中包含 DTL 映射、映射映射和列表以及向量。
我需要从 C++ 本机代码调用托管 C++ 函数,并且需要将这些本机对象和 STL 容器(列表、地图、地图地图)传递给 C++/CLI。它需要编组或如何序列化这些对象。我怎样才能做到这一点没有任何问题。这样在编组和序列化回托管 C++/CLI 之后,地图应该与字典和字典的字典、stl 列表和托管 List<> 等进行编组。
我怎样才能在所有情况下都做到这一点?是否需要复杂的编组问题处理......?
问候乌斯曼
memory - pin_ptr 原生 void* 帮助
设置
我有一个 PDF API,它具有下面定义的本机函数。
如果我在我的 C++/CLI 包装函数中调用上述代码,它会返回正确的字符串,但在我调用 PDF_CloseDoc 时会引发 AccessViolationException。哎呀。我忘了 pin_ptr 指向文档的指针。
问题
当我 pin_ptr pdoc 时,我可以成功调用这些本机函数,但是当 PDF_GetMetaText 返回时缓冲区不再包含我的字符串。
我也尝试过固定缓冲区[0],但这会导致 GetMetaText 出现访问冲突异常。
问题
我不能说 GetMetaText 中发生了什么,所以我不确定 pdoc 发生了什么。对上述代码有什么建议吗?
assemblies - 如何修复 CRT 依赖性导致我的 vc2005 混合模式 DLL 在 XP 上出现 FileLoadException?
我在 Visual Studio 2005 中构建了一个混合模式 DLL。在依赖项walker 中,我的 DLL 显示了以下 CRT Dlls 的依赖项。请注意,这是在我的 Windows 7 开发机器上。
c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5\MSVCP80.DLL
"\MSVCR80.DLL
"\MSVCM80.DLL
8.0.50727.4927
在我使用 Visual Studio 2005 的 Windows 7 开发机器上,它编译并运行得很好。问题是它不会在我安装了最新 CRT 的 Windows XP 测试机器上运行。
当我将 DLL 拖到 XP 机器上的 depenency walker 中时,它似乎正在搜索 \System32 中的 DLL...(我去显示完整路径并且没有它们的路径,只有一个黄色感叹号)
问题是WinSxS中这个版本(build 4927)的crt没有安装在XP测试机上。它具有安装了最新 CRT (sp1?) 的 Visual Studio 2005。
8.0.50727.4053是我可以在 MSDN 上找到的最新版本。
我意识到这不是 SO 上发布的最令人兴奋的问题,但是有人知道这个 4927 运行时是怎么回事吗?
* 编辑 *
MT.exe 生成的清单:
因此,它针对的是 3 个不同的版本...
visual-studio-2008 - 混合模式程序集 [log4net] 不会在 .NET 4.0 中加载,也不会在为 .NET 4.0 重新编译时工作
我讨厌问一个在这里被问过无数次的问题,以及到处都是博客,但我仍然无法让我的升级项目正常工作。
我的应用程序最初是用 VS2008 编写的,面向 .NET 3.5 SP1。我刚刚升级到 VS2010,并想尝试利用新的语言功能和集成的 MEF,所以我将所有项目都更改为面向 .NET 4.0。在正确设置并正确编译所有内容(如构建后事件、MEF 引用和类似的东西)后,我运行我的应用程序并得到了众所周知的错误:
混合模式程序集是针对运行时版本“v2.0.50727”构建的,如果没有额外的配置信息,则无法在 4.0 运行时中加载。
然后我将以下属性添加到我的<startup>
元素中app.config
:
但是当我运行我的应用程序时,我仍然得到同样的错误。我能做些什么来进一步调试这个问题吗?我真的不知道还能尝试什么。我试图找到尽可能多的关于混合模式程序集以及它们与 CLR 交互方式的信息,但我在这方面的背景知识充其量是有限的。
我还尝试通过将 log4net 的源代码重新编译为目标 .NET 4.0 来解决这个问题,但这并没有达到我的预期。编译后,我得到了这个错误:
覆盖成员时违反了继承安全规则:'log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'。重写方法的安全可访问性必须与被重写方法的安全可访问性相匹配。
所以我找到了一篇建议尝试将以下行添加到 AssemblyInfo.cs 的帖子:
当我这样做时,我就回到了我开始的地方!(混合模式组装错误)。
啊。
visual-studio-2008 - 如何在混合模式下使用调试器执行单元测试?(VS2008)
我正在修复一些单元测试,我需要调试它们。调用堆栈是混合的(有托管和非托管 DLL),所以我需要调试器处于混合模式。
据我所见,如果您启动本机单元文本,则调试器处于本机模式,如果您启动托管 UT,则调试器是托管的。
有没有办法在混合模式下设置它?
先谢谢各位小伙伴了。
编辑:为了澄清事情,我要做的是从 Visual Studio 中可用的单元测试列表中单击“调试”按钮。如果我通过托管测试执行此操作,则调试器将以托管模式启动,如果我通过非托管测试 (C++/CLI) 执行此操作,则调试器将以非托管模式启动。
c++-cli - C++ 虚拟表错误?
我有以下结构:
我的问题是在我的非托管代码的某个地方,我必须调用 Send 函数。它从托管代码 Send 调用函数,但是,Send 函数从 Parser 类调用 Transmit 方法。问题是当我调试时,pParser 实例是空的(即使我之前已经在构造函数中实例化了它)。
这是垃圾收集器问题还是虚拟表误导?我该如何解决?谢谢 !
更新: 经过进一步调试后,我意识到如果我包含其他 gcroot 实例,例如:
gcroot<AppDomaion^> pDomain;
然后,在代码中,尝试运行:
pDomain = AppDomain::CurrentDomain;
调试器将显示与 pParser 相同的空值。我在做什么有什么问题吗?我应该以不同的方式实例化类吗?
更新2:
托管/非托管是这样的:
包装器:(包装器.h)
包装器(包装器.cpp)
非托管:(commLayer.h)
非托管:(IInterface.h)
问题是当非托管代码调用 mInferface->Deliver(mMessage) 时;mParent 没有实例。然后,在 Wrapper 中,mParent 为空(value = null);就像它只会访问来自非托管 IInterface 的方法,而不是来自包装器 CInterface 的 Wrapper^。