.NET 3.5 がインストールされているかどうかをプログラムで判断する必要があります。簡単だと思いました:
<% Response.Write(Environment.Version.ToString()); %>
「2.0.50727.1434」を返すので、そのような運はありません...
私の調査では、見ることができるかなりあいまいなレジストリキーがいくつかあることがわかりましたが、それが進むべき道かどうかはわかりません。誰か提案はありますか?
.NET 3.5 がインストールされているかどうかをプログラムで判断する必要があります。簡単だと思いました:
<% Response.Write(Environment.Version.ToString()); %>
「2.0.50727.1434」を返すので、そのような運はありません...
私の調査では、見ることができるかなりあいまいなレジストリキーがいくつかあることがわかりましたが、それが進むべき道かどうかはわかりません。誰か提案はありますか?
A good resource I found:
http://www.walkernews.net/2008/05/16/how-to-check-net-framework-version-installed/
あなたは試すことができます:
static bool HasNet35()
{
try
{
AppDomain.CurrentDomain.Load(
"System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
return true;
}
catch
{
return false;
}
}
@ Nick : いい質問ですね。少し試してみます。
ケブ
これは、技術的には .NET 3.5 が 2.0 フレームワークの拡張であるためです。最も簡単な方法は、.NET 3.5 のアセンブリを含めて、それが壊れるかどうかを確認することです。
System.Web.Extensions
バージョン 3.5 にのみ含まれている優れたアセンブリです。また、ASP.NET を使用してこのチェックを実行しているようですが、ASP.NET の保護モードで実行されているファイル システムまたはレジストリをチェックできないため、実際には制限があります。または、.NET 3.5 にのみ存在するはずの GAC からアセンブリを読み込もうとすると、常に問題が発生する可能性がありますが、アクセス許可に関する問題が再び発生する可能性があります。
これは、「私は何を達成しようとしているのか?」と自問するときの 1 つかもしれません。代替ルートがあるかどうかを確認します。
@Kev, really like your solution. Thanks for the help.
Using the registry the code would look something like this:
RegistryKey key = Registry
.LocalMachine
.OpenSubKey("Software\\Microsoft\\NET Framework Setup\\NDP\\v3.5");
return (key != null);
I would be curious if either of these would work in a medium trust environment (although I am working in full trust so it doesn't matter to what I am currently working on).
もう 1 つの興味深い発見は、ここにアセンブリが存在することです。
C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5
マイクロソフトが「最新バージョン」のチェックをフレームワークに組み込むと思うでしょう。
1 つのオプションは、バージョン文字列を使用して 4.0 を検出することです。
Environment.Version.CompareTo(new Version(4, 0));
2.0 と 2.5 は CLR のバージョン番号を共有しているため、レジストリをチェックしてこれらを区別する必要があります。これらのバージョンはすでにリリースされているため、検索する文字列はわかっています。
特定のバージョンの .net をインストールする必要があり、アプリケーションの配布を制御できる場合は、実際にClickOnceを使用する必要があります。インストールする必要がある .Net フレームワークの最低限必要なバージョンを指定できます。また、インストール時にのみチェックするため、その後のすべての起動が不要なチェックによって妨げられることはありません。
また、ClickOnce を使用すると、無料で更新できます。なぜ誰かがそれを使いたくないのですか?
ClickOnce アプリケーションを設定するには、Visual Studio 内でプロジェクトを右クリックし、[発行設定] に移動します。これにより、Web サイトに配置できるアプリケーションの特別なビルドが作成されます。ユーザーがプログラムをダウンロードすると、インストーラーが .Net などの前提条件をチェックします。
@komradekatz、これを検討している他のユーザーの便宜のために、MSDN から以下のソリューションを提供します。ユーザーエージェントを使用してバージョンを判断するため、このソリューションは好きではありません。これは私が必要とするものには実行できません (.NET 3.5 がインストールされているかどうかを知る必要があるクラス ライブラリを作成しています)。また、このソリューションがどれほど信頼できるものであるかについても疑問があります。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
<HEAD>
<TITLE>Test for the .NET Framework 3.5</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" />
<SCRIPT LANGUAGE="JavaScript">
<!--
var dotNETRuntimeVersion = "3.5.0.0";
function window::onload()
{
if (HasRuntimeVersion(dotNETRuntimeVersion))
{
result.innerText =
"This machine has the correct version of the .NET Framework 3.5."
}
else
{
result.innerText =
"This machine does not have the correct version of the .NET Framework 3.5." +
" The required version is v" + dotNETRuntimeVersion + ".";
}
result.innerText += "\n\nThis machine's userAgent string is: " +
navigator.userAgent + ".";
}
//
// Retrieve the version from the user agent string and
// compare with the specified version.
//
function HasRuntimeVersion(versionToCheck)
{
var userAgentString =
navigator.userAgent.match(/.NET CLR [0-9.]+/g);
if (userAgentString != null)
{
var i;
for (i = 0; i < userAgentString.length; ++i)
{
if (CompareVersions(GetVersion(versionToCheck),
GetVersion(userAgentString[i])) <= 0)
return true;
}
}
return false;
}
//
// Extract the numeric part of the version string.
//
function GetVersion(versionString)
{
var numericString =
versionString.match(/([0-9]+)\.([0-9]+)\.([0-9]+)/i);
return numericString.slice(1);
}
//
// Compare the 2 version strings by converting them to numeric format.
//
function CompareVersions(version1, version2)
{
for (i = 0; i < version1.length; ++i)
{
var number1 = new Number(version1[i]);
var number2 = new Number(version2[i]);
if (number1 < number2)
return -1;
if (number1 > number2)
return 1;
}
return 0;
}
-->
</SCRIPT>
</HEAD>
<BODY>
<div id="result" />
</BODY>
</HTML>
私のマシンでは、次のように出力されます。
このマシンには、正しいバージョンの .NET Framework 3.5 が搭載されています。
このマシンの userAgent 文字列は次のとおりです: Mozilla/4.0 (互換性あり; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.5 .21022; Zune 2.5)。
Without any assembly loading and catching exceptions (which is slow), check for class API changes between 2.0 and 3.5. Mono Class Status is very helpful for this. For example you could check for GC.Collect Method (Int32, GCCollectionMode)
which is in mscorlib and was added in 3.5 .