我有我的项目目标4.0.我将其更新为4.5并添加了VS.
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
Run Code Online (Sandbox Code Playgroud)
除了改变TargetFrameworkVersion之外,我很好奇这是多余的.我的理解是,如果运行时没有找到supportedRuntime,它会使用用于构建exe的.net版本.所以在这种情况下,exe是使用4.5构建的,它也说使用4.5.无论我是否拥有此功能,它的行为都会有所不同,并在只有4.0的机器上运行吗?
我有一个使用新的.NET 4 System.Runtime.Caching MemoryCache的MVC 3应用程序的问题.我注意到在看似无法预测的时间之后,它会停止缓存,并且表现得像空的一样.考虑一下我直接从ASP.NET MVC中的测试View获取的代码:
MemoryCache.Default.Set("myname","fred", new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0,5,0) });
Response.Write(MemoryCache.Default["myname"]);
Run Code Online (Sandbox Code Playgroud)
当它工作时,可预测的"fred"被打印出来.但是,当问题开始出现时,尽管如此Set(),值为MemoryCache.Default["myname"]null.我可以通过在线上设置断点Response.Write()并使用立即窗口直接设置和读取缓存来证明这一点- 它不会设置它并保持为空!让它再次运行的唯一方法是使AppDomain回收.
有趣的是,当应用程序正常工作时,我可以通过打破Response.Write()线路并运行来激发问题MemoryCache.Default.Dispose().之后,MemoryCache.Default本身不为null(为什么会这样?),但不保存任何设置.它不会导致任何错误,但不会保存任何内容.
任何人都可以验证并解释吗?我相信我已经发现,当应用程序停止工作时,有些东西是Disposing MemoryCache.Default,但这不是我!
UPDATE
好吧,我现在厌倦了这个问题!CLRProfiler似乎不适用于MVC 3.SciTech的CLR工具很好 - RedGate ANTS也是如此.但他们告诉我的只是MemoryCache对象被某些东西处理掉了!我还证明了(通过时间戳打印)我的页面上应该被缓存的部分视图(由OutputCacheAttribute指定)在几分钟后停止缓存 - 它会在每次调用页面时开始刷新.为了澄清环境,我直接在运行Win 7 Ultimate的开发工作站上的IIS 7.5服务器上运行.上面提到的内存工具表明我在播放对象方面只使用了大约9mb的内存.
无奈之下,我已经改变了我的缓存代码,首先搜索环境HttpContext以挂钩并使用其缓存功能(如果有的话).早期测试显示这是可靠的,但感觉就像一个讨厌的黑客.
我觉得MemoryCache和OutputCache不能保证与MVC 3一起工作......
我正在使用InstallShield 2010.我想检查计算机上是否安装了.NET framework 4.5.
我可以检查.NET Framework 4.0是否已安装在注册表中,但我无法找到.NET Framework 4.5的任何注册表项.
我如何获得我所针对的.NET Framework版本,而不是应用程序当前运行的.NET框架版本?
例如,如果应用程序以.NET Framework 4.5为目标,我需要知道我的目标是.NET Framework 4.5.
例如,检查System.Environment.Version:
4.0.30319.185024.0.30319.18502所以这不起作用.
真正的目标是尝试解决.NET中缺少编译器定义的问题.
我有一个简单的问题:当我在Visual Studio 2012中转到HELP-> About时,窗口显示我正在使用的.NET版本是4.5.50709.但是,当我执行以下代码时:
Console.WriteLine(Environment.Version);
Run Code Online (Sandbox Code Playgroud)
我得到版本4.0.30319.18034.是什么赋予了?在Troelsen的Pro C#5和.NET 4.5 Framework(第81页)中,它指出Version属性返回一个表示.NET平台版本的对象.这是不正确的?上一个问题的线程表明此属性返回CLR版本.如果是这种情况,Version对象的目的是什么(例如,知道CLR版本而不是框架版本的用途是什么),以及如何实际获得框架版本?
我需要一种方法在我的应用程序中使用dnx写入Windows的事件查看器.但是,EventLog该类在System.Diagnostics命名空间中不可用,所以我被卡住了.还有其他方法可以写入EventViewer吗?
我已经提到了Stack Overflow问题有没有一种简单的方法来检查.NET Framework版本?.但是那里给出的建议并不适用于以下目的.
我们如何识别C#控制台应用程序正在使用的.NET版本?
环境:
码
using System;
using System.Globalization;
using Microsoft.Win32;
namespace TESTConsoleApplication
{
class Program
{
static void Main(string[] args)
{
//.NET version: Approach 1
RegistryKey installed_versions = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
string[] version_names = installed_versions.GetSubKeyNames();
double latestFramework = Convert.ToDouble(version_names[version_names.Length - 1].Remove(0, 1), CultureInfo.InvariantCulture);
int SP = Convert.ToInt32(installed_versions.OpenSubKey(version_names[version_names.Length - 1]).GetValue("SP", 0));
Console.WriteLine(latestFramework);
//Approach 2
string versionval = Environment.Version.ToString();
Console.WriteLine(versionval);
//Approach 3
string systemVersionVal = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion().ToString();
Console.WriteLine(systemVersionVal);
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
产量

版本设置

为了能够调查为我的一个应用程序报告的问题,我需要知道我的应用程序在用户端运行的(运行时)环境。除了应用程序的版本和操作系统的版本,我还想向用户显示.NET CLR版本和(如果可能).NET Framework版本,以便用户可以将这些信息报告给我。
我发现了几种用于检测已安装的 .NET Framework的解决方案,但这不是我所需要的。
我不在乎(一开始)用户计算机上还安装了什么其他软件。根据定义,实际上未用于运行我的应用程序的.NET Framework安装是其他软件,而不是相关软件。
为了满足CLR版本要求,我发现Environment.Version.ToString()它很有用。
但是,阅读文档会使我感到焦虑。Environment.Version文档的 “ 备注”部分指出,
对于.NET Framework 4.5及更高版本,我们不建议使用Version属性来检测运行时的版本[...]
我了解API之类的CLR,了解诸如组件和可以更新的实际逻辑之类的Framework。因此,知道CLR版本是一个好的开始,但是也可能需要Framework版本,因为它可能指出由于实际Framework(逻辑)中的错误而导致的不兼容性。我的应用程序中的错误可能是框架中的错误导致的,因此我的应用程序中没有错误(但可能存在解决方法)。这样可以大大加快调试过程。
Environment.Version考虑到有关这些注意事项,对于在.NET Framework 4.0版至4.7.2版之间运行的应用程序,我可以安全地使用哪些版本的CLR?
有什么方法可以检测用于运行应用程序的.NET Framework版本(组件和逻辑)?也许通过反映加载的程序集并从特定程序集获取程序集版本,但是这种方法可靠吗?
我正在调试 C# 应用程序崩溃。崩溃是在调用外部本机 DLL 时发生的。
Windows 事件日志包含以下报告。我的目标是.NET 4.5(在 Visual Studio 中)并且目标 PC 具有.NET 4.5.2。
我的问题是:为什么框架版本显示v4.0.30319?在我看来,应用程序运行在错误的 .NET 框架下。
Application: XXXXXXX.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
at XXXXXXX.SVcamApi+NativeMethods.SVInterfaceGetDeviceId_64(Void*, UInt32, SByte*, UInt32*)
at XXXXXXX.SVcamApi+NativeMethods.SVInterfaceGetDeviceId_64(Void*, UInt32, SByte*, UInt32*)
at XXXXXXX.SVcamApi.SVS_InterfaceGetDeviceId(IntPtr, UInt32, System.String ByRef, UInt32 ByRef)
at XXXXXXX.XXXXXXX+Cameracontainer.deviceDiscovery()
at XXXXXXX.XXXXXXX.buttonDiscover_Click(System.Object, System.EventArgs)
at XXXXXXX.XXXXXXX.DiscoverAndConnect()
at XXXXXXX.XXXXXXX..ctor()
at XXXXXXX.Program.Main()
Run Code Online (Sandbox Code Playgroud)
我已确认使用 Raymondcc .NET 检测器实用程序安装了 4.5.2: https://www.raymond.cc/blog/how-to-check-what-version-of-microsoft-net-framework-is-安装在计算机中/
令人惊讶的是,.NET 检测器表明 4.0 甚至没有安装;它显示已安装的 …
.net ×8
c# ×5
.net-4.5 ×1
.net-core ×1
asp.net ×1
asp.net-mvc ×1
caching ×1
dnx ×1
frameworks ×1
logging ×1
memorycache ×1
version ×1