标签: mixed-mode

'useLegacyV2RuntimeActivationPolicy'在.NET 4配置中做了什么?

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

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

谷歌搜索给了我解决方案,这是将其添加到应用程序配置:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

.net mixed-mode app-config .net-4.0

209
推荐指数
2
解决办法
13万
查看次数

.NET 4中的混合模式汇编

我在大约2年前在.NET 2.0中编写了一个用于数据库访问的类库,并且一直在.NET 2.0,3.0和3.5上使用它.

在我正在进行的当前项目(这是一个.NET 4.0应用程序)中,尝试使用旧的忠实类库,我得到以下异常:


System.InvalidOperationException was unhandled
  Message=An error occurred creating the form. See Exception.InnerException for details.
    The error is: Mixed mode assembly is built against version 'v2.0.50727' of the runtime
    and cannot be loaded in the 4.0 runtime without additional configuration information.
    Source=SchoolManager
  StackTrace:
       at SchoolManager.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 190
       at SchoolManager.My.MyProject.MyForms.get_frmGeneric()
       at SchoolManager.My.MyApplication.OnCreateMainForm() in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\My Project\Application.Designer.vb:line 35
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at SchoolManager.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] …

.net mixed-mode .net-4.0

36
推荐指数
2
解决办法
5万
查看次数

新的SQLite混合程序集

以前可以使用.NET SQLite库http://sqlite.phxsoftware.com,但最近它们已被主要的SQLite团队接管并移动了System.Data.SQLite下载页面.新包似乎不再包含混合程序集(包含sqlite3.dll和.NET包装器的单个程序集).

新的软件包附带了.NET DLL,SQLite.Interop.dll并且桌面上不需要基于文档但我的应用程序无法加载Unable to load DLL 'SQLite.Interop.DLL': The specified module could not be found..我尝试在IIS/IIS Express下运行应用程序,将apppool设置为32位.

我已经尝试将SQLite.Interop.dll文件复制到文件bin夹,系统文件夹和ASP.NET临时文件夹中,但仍然会收到相同的错误.

是否有可用于新版本的混合组件?如果没有,有没有办法解决Unable to load DLL 'SQLite.Interop.DLL错误?

.net sqlite iis mixed-mode

26
推荐指数
3
解决办法
1万
查看次数

ASP.NET MVC和混合模式身份验证

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

有人可以通过代码示例提供有关如何完成此操作的详细说明吗?

谢谢.

艾伦T.

asp.net-mvc mixed-mode

24
推荐指数
2
解决办法
3万
查看次数

使用静态存储持续时间破坏本机对象

2012-12-09摘要:

  • 在普通的混合模式应用程序中,全局本机C++析构函数作为终结器运行.无法更改该行为或关联的超时.
  • 混合模式程序集DLL在DLL加载/卸载期间运行C++构造函数/析构函数 - 与本机DLL完全相同.
  • 使用COM接口在本机可执行文件中托管CLR 允许解构器的行为与本机DLL(我想要的行为)一样,并为终结器设置超时(额外的奖励).
  • 据我所知,上述内容至少适用于Visual Studio 2008,2010和2012.(仅用.NET 4测试过)

我计划使用的实际CLR托管可执行文件与此问题中概述的非常类似,除了一些小的更改:

  • OPR_FinalizerRun根据Hans Passant的建议设置为某个值(当前为60秒,但可能会发生变化).
  • 使用ATL COM智能指针类(这些在Visual Studio的快速版本中不可用,所以我在这篇文章中省略了它们).
  • Lodaing CLRCreateInstancemscoree.dll动态(以允许更好的错误消息没有安装兼容CLR时).
  • 将命令行从主机传递到Main程序集DLL中的指定函数.

感谢所有花时间阅读问题和/或评论的人.


2012-12-02帖子底部更新.

我正在使用Visual Studio 2012和.NET 4进行混合模式C++/CLI应用程序,并且惊讶地发现某些本机全局对象的析构函数没有被调用.调查的问题,它原来,他们表现得像管理对象在解释这个职位.

我对此行为感到非常惊讶(我理解它对于托管对象)并且无法在任何地方找到它,无论是在C++/CLI标准中还是在析构函数和终结器的描述中.

根据Hans Passant的评论中的建议,我将程序编译为程序集DLL并将其托管在一个小的本机可执行文件中,这确实给了我所需的行为(析构函数有足够的时间来完成和运行在同一个线程中建造)!

我的问题:

  1. 我可以在独立的可执行文件中获得相同的行为吗?
  2. 如果(1)不可行,是否可以ICLRPolicyManager->SetTimeout(OPR_ProcessExit, INFINITE)为可执行文件配置进程超时策略(即基本上调用)?这将是一个可接受的解决方法.
  3. 在哪里记录/我如何更多地了解这个主题?我宁愿不依赖易于改变的行为.

要重现如下编译以下文件:

cl /EHa /MDd CLRHost.cpp
cl /EHa /MDd /c Native.cpp
cl /EHa /MDd /c /clr CLR.cpp
link /out:CLR.exe Native.obj CLR.obj 
link /out:CLR.dll /DLL Native.obj CLR.obj 
Run Code Online (Sandbox Code Playgroud)

不需要的行为:

C:\Temp\clrhost>clr.exe
[1210] …
Run Code Online (Sandbox Code Playgroud)

.net windows clr mixed-mode c++-cli

24
推荐指数
1
解决办法
2978
查看次数

如何在混合(C#/ C++)调试中设置数据断点?

我在C#中启动我的程序,然后调用一些非托管的C++.

当我在非托管C++中断行时,"新数据断点"菜单项显示为灰色.

有没有办法解决?

.net debugging mixed-mode visual-studio-2008

21
推荐指数
2
解决办法
1万
查看次数

在Win 8.1下c ++/cli DLL失败

我写了一个Win32/net DLL,它在Win XP,Win7和8下工作正常,但在Win 8.1下它失败了.

Dependency Walker说:找不到API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL(user32.dll会调用它们)

谷歌意味着,MS改变了8.1中的一些系统DLL(并忽略了兼容性),因此许多程序都有同样的问题.

"找不到文件"的完整列表:

API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL
MSVCR120.DLL
API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL
API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL
EXT-MS-WIN-NTUSER-UICONTEXT-EXT-L1-1-0.DLL
IESHIMS.DLL
Run Code Online (Sandbox Code Playgroud)

有人知道如何解决这个问题吗?

windows dll winapi mixed-mode c++-cli

18
推荐指数
1
解决办法
2万
查看次数

在Visual Studio 2013中对托管单元测试使用混合模式调试

我在Visual Studio 2013测试框架中进行了C#单元测试,该测试框架运行CLI和本机代码.我想在执行C#单元测试时调查代码的本机部分.但是,运行Test - > Debug - > All Tests运行托管调试器,因此本机代码中的断点不会被命中,我无法跟踪C# - > C++/CLI代码,就像在混合模式调试器下运行程序一样.

例如,我的单元测试中的代码:

[TestMethod]
public void TestRoundTripEvaluate()
{
     var obj = new MyCLIObject();
     var roundtripped = RoundtripXml( obj );

     // I would like to trace into here to see why Equals returns false.
     // But the definition for MyCLIObject is in a CPP file and cannot be navigated 
     // to running the unit test because Visual Studio starts the debugger as "managed only"
     // when using Test -> Debug …
Run Code Online (Sandbox Code Playgroud)

c# mixed-mode unit-testing visual-studio-2013

17
推荐指数
1
解决办法
2016
查看次数

鉴于选择,混合模式程序集与单独的互操作DLL的优缺点是什么?

当"混合模式组装"和"单独的互操作dll"版本都提供第三方组件时,每种组件的优缺点是什么?

一个很好的例子是System.Data.SQLite.

以上链接有这样的说法:

只有在出于某种原因必须将汇编二进制文件部署到全局程序集缓存的情况下,才应使用[混合模式汇编]程序包.

但为什么?混合模式程序集似乎在我的项目中工作正常,没有安装GAC(只需xcopy到应用程序的exe目录).有一个更少的DLL是很好的.这感觉整洁.那么缺点是什么?

反之亦然,为什么一个人会赞成这两个DLL"native-dll + interop-dll"版本?

.net sqlite mixed-mode interop .net-assembly

16
推荐指数
1
解决办法
528
查看次数

托管C++ .NET应用程序中未处理的托管异常访问冲突问题

这实际上是一个已经解决的问题,但它太深奥了,我以为我会为其他用户分享它.

也许其他人可能会提出理由?

无论如何,我正在研究用托管C++编写的"混合模式".NET应用程序,但是它与现有的本机库有很多链接.

问题是,未处理的托管异常最终成为Win32访问冲突.我的意思是,不是显示漂亮的.NET对话框,而是使用未处理的托管异常,而不是我将获得旧样式"未处理的win32异常发生在......"消息.

这是有趣的事情:如果我在调试器中启动应用程序,则会正确地拾取抛出的托管异常.即调试器向我显示该行.

但是,正常执行时,它将变为此访问冲突.在那一点附加调试器将产生很少的有用信息(它甚至不会显示合理的堆栈跟踪).

所以,对我而言,它表明在未处理的托管异常到达异常处理程序之前,本机代码中正在发生某些事情.

所以无论如何,我设法通过将我的项目与Visual Studio 2008生成的干净的新C++托管项目进行比较来解决问题.

解决方法是执行以下操作:

  1. 将/ SUBSYSTEM标志(项目属性 - >链接器 - >系统 - >子系统)/SUBSYSTEM:WINDOWS 更改为 "未设置"

  2. 从使用旧样式WinMain()切换到使用新样式main().

也就是过去

  int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
Run Code Online (Sandbox Code Playgroud)

它现在是

int main(array<System::String ^> ^args)
Run Code Online (Sandbox Code Playgroud)

[为什么我使用这个奇怪的_tWinMain?这是多年前在创建示例混合模式Windows应用程序时由Visual Studio .NET IDE生成的.它一直很好(直到现在)所以我从来没有打扰过它._tWinMain只是WinMain的一个宏]

我做了这个改变,问题就消失了.未处理的.NET异常现在被正确捕获,因此我现在可以实际调试它们.

我还对干净的示例C++应用程序进行了相反的更改,并证明了它是原因.

所以,我真正的问题是,到底发生了什么?

是不是只使用了旧式WinMain而不是新款main(array <String^>^)

我是否应该向微软报告此事(任何人都会关心;-))?

.net c++ mixed-mode exception-handling

15
推荐指数
1
解决办法
2314
查看次数