P/Invoking の前に機能が存在するかどうかを検出する良い方法を見つけようとしています。たとえば、ネイティブStrCmpLogicalW
関数を呼び出します。
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern int StrCmpLogicalW(string psz1, string psz2);
}
この機能を持たない一部のシステムではクラッシュします。
バージョン チェックを実行したくありません。これは悪い習慣であり、間違っている場合もあります (たとえば、機能がバックポートされている場合や、機能がアンインストールされている場合など)。
正しい方法は、からのエクスポートの存在shlwapi.dll
を確認することです。
private static _StrCmpLogicalW: function(String psz1, String psz2): Integer;
private Boolean _StrCmpLogicalWInitialized;
public int StrCmpLogicalW(String psz1, psz2)
{
if (!_StrCmpLogialInitialized)
{
_StrCmpLogicalW = GetProcedure("shlwapi.dll", "StrCmpLogicalW");
_StrCmpLogicalWInitialized = true;
}
if (_StrCmpLogicalW)
return _StrCmpLogicalW(psz1, psz2)
else
return String.Compare(psz1, psz2, StringComparison.CurrentCultureIgnoreCase);
}
もちろん、問題は C# が関数ポインターをサポートしていないことです。
_StrCmpLogicalW = GetProcedure("shlwapi.dll", "StrCmpLogicalW");
できません。
だから私は.NETで同じロジックを実行するための代替構文を見つけようとしています. 私はこれまでに次の疑似コードを持っていますが、私は困惑しています:
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
private Boolean IsSupported = false;
private Boolean IsInitialized = false;
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, Export="StrCmpLogicalW", CaseSensitivie=false, SetsLastError=true, IsNative=false, SupportsPeanutMandMs=true)]
private static extern int UnsafeStrCmpLogicalW(string psz1, string psz2);
public int StrCmpLogicalW(string s1, string s2)
{
if (!IsInitialized)
{
//todo: figure out how to loadLibrary in .net
//todo: figure out how to getProcedureAddress in .net
IsSupported = (result from getProcedureAddress is not null);
IsInitialized = true;
}
if (IsSupported)
return UnsafeStrCmpLogicalW(s1, s2);
else
return String.Compare(s1, s2, StringComparison.CurrentCultureIgnoreCase);
}
}
そして私は助けが必要です。
存在を検出したいエクスポートの別の例は次のとおりです。
dwmapi.dll::DwmIsCompositionEnabled
dwmapi.dll::DwmExtendFrameIntoClientArea
dwmapi.dll::DwmGetColorizationColor
dwmapi.dll::DwmGetColorizationParameters
(文書化されていない1、まだ名前でエクスポートされていない、序数 127)dwmapi.dll::127
(文書化されていない1、DwmGetColorizationParameters)
1 Windows 7 SP1 以降
OS 機能の存在を確認するためのデザイン パターンが .NET に既に存在している必要があります。.NET で機能検出を実行するための推奨される方法の例を誰か教えてもらえますか?