在将使用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
什么?我找不到任何关于它的文档.
我在大约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 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
错误?
我有一个场景,我要求用户能够使用Windows身份验证或Forms身份验证对ASP.NET MVC Web应用程序进行身份验证.如果用户在内部网络上,他们将使用Windows身份验证,如果他们在外部连接,他们将使用Forms身份验证.我见过很多人问这个问题我如何为此配置ASP.NET MVC Web应用程序,但我还没有找到完整的解释.
有人可以通过代码示例提供有关如何完成此操作的详细说明吗?
谢谢.
艾伦T.
2012-12-09摘要:
我计划使用的实际CLR托管可执行文件与此问题中概述的非常类似,除了一些小的更改:
OPR_FinalizerRun
根据Hans Passant的建议设置为某个值(当前为60秒,但可能会发生变化).CLRCreateInstance
从mscoree.dll
动态(以允许更好的错误消息没有安装兼容CLR时).Main
程序集DLL中的指定函数.感谢所有花时间阅读问题和/或评论的人.
2012-12-02帖子底部更新.
我正在使用Visual Studio 2012和.NET 4进行混合模式C++/CLI应用程序,并且惊讶地发现某些本机全局对象的析构函数没有被调用.调查的问题,它原来,他们表现得像管理对象在解释这个职位.
我对此行为感到非常惊讶(我理解它对于托管对象)并且无法在任何地方找到它,无论是在C++/CLI标准中还是在析构函数和终结器的描述中.
根据Hans Passant的评论中的建议,我将程序编译为程序集DLL并将其托管在一个小的本机可执行文件中,这确实给了我所需的行为(析构函数有足够的时间来完成和运行在同一个线程中建造)!
我的问题:
ICLRPolicyManager->SetTimeout(OPR_ProcessExit, INFINITE)
为可执行文件配置进程超时策略(即基本上调用)?这将是一个可接受的解决方法.要重现如下编译以下文件:
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) 我在C#中启动我的程序,然后调用一些非托管的C++.
当我在非托管C++中断行时,"新数据断点"菜单项显示为灰色.
有没有办法解决?
我写了一个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)
有人知道如何解决这个问题吗?
我在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) 当"混合模式组装"和"单独的互操作dll"版本都提供第三方组件时,每种组件的优缺点是什么?
一个很好的例子是System.Data.SQLite.
以上链接有这样的说法:
只有在出于某种原因必须将汇编二进制文件部署到全局程序集缓存的情况下,才应使用[混合模式汇编]程序包.
但为什么?混合模式程序集似乎在我的项目中工作正常,没有安装GAC(只需xcopy到应用程序的exe目录).有一个更少的DLL是很好的.这感觉整洁.那么缺点是什么?
反之亦然,为什么一个人会赞成这两个DLL"native-dll + interop-dll"版本?
这实际上是一个已经解决的问题,但它太深奥了,我以为我会为其他用户分享它.
也许其他人可能会提出理由?
无论如何,我正在研究用托管C++编写的"混合模式".NET应用程序,但是它与现有的本机库有很多链接.
问题是,未处理的托管异常最终成为Win32访问冲突.我的意思是,不是显示漂亮的.NET对话框,而是使用未处理的托管异常,而不是我将获得旧样式"未处理的win32异常发生在......"消息.
这是有趣的事情:如果我在调试器中启动应用程序,则会正确地拾取抛出的托管异常.即调试器向我显示该行.
但是,正常执行时,它将变为此访问冲突.在那一点附加调试器将产生很少的有用信息(它甚至不会显示合理的堆栈跟踪).
所以,对我而言,它表明在未处理的托管异常到达异常处理程序之前,本机代码中正在发生某些事情.
所以无论如何,我设法通过将我的项目与Visual Studio 2008生成的干净的新C++托管项目进行比较来解决问题.
解决方法是执行以下操作:
将/ SUBSYSTEM标志(项目属性 - >链接器 - >系统 - >子系统)从/SUBSYSTEM:WINDOWS 更改为 "未设置"
从使用旧样式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^>^)
?
我是否应该向微软报告此事(任何人都会关心;-))?
mixed-mode ×10
.net ×7
.net-4.0 ×2
c++-cli ×2
sqlite ×2
windows ×2
app-config ×1
asp.net-mvc ×1
c# ×1
c++ ×1
clr ×1
debugging ×1
dll ×1
iis ×1
interop ×1
unit-testing ×1
winapi ×1