1

オラクルは、あり得ないことをしたようです(IMHO):)

私は Oracle からサービスを受けています (私を撃たないでください。私はただの開発者です!)

名前 = "Oracle Enterprise Pack for Eclipse NodeManager (C_Oracle_Middleware_Home_wlserver_12.1)"

全87文字。System.ServiceProcess.ServiceController.get_ServicesDependedOn() 呼び出しを使用して依存するサービスを特定しようとすると、例外が発生します。

「サービス名 Oracle Enterprise Pack for Eclipse NodeManager (C_Oracle_Middleware_Home_wlserver_12.1) に無効な文字が含まれているか、空であるか、長すぎます (最大長 = 80)」

この名前は、サービスのレジストリ キーの名前でもあります。私の理解では、このプロパティ (Win32_Service クラスの名前) は 80 文字に制限されているはずです。

コンストラクターが無効であるが正常にインストールされたサービスをbarfsすると、 ServiceController クラスの使用が非常に難しくなります。-__-

明日コードを出荷しなければならないので、私の簡単な修正は、サービス名を切り詰めて 80 文字にし、それを「Hail Mary Fix」と呼ぶことです。

これを回避するより良い方法を見つけた人はいますか?Windows がこの分野でどのように緩んでいるかを制御することはできず、サービス開発者 (Oracle) はサービスの短い名前の 80 文字の制限を順守していません。

助けて、オビワン!;)

4

1 に答える 1

0

おそらく別の方法を見つける必要があるでしょう。ServiceController を逆コンパイルしたところ、80 文字のチェックが組み込まれているメソッドが見つかりました。代わりに、sc.exe などにシェル アウトすることができます。

// System.ServiceProcess.ServiceController
internal static bool ValidServiceName(string serviceName)
{
    if (serviceName == null)
    {
        return false;
    }
    if (serviceName.Length > 80 || serviceName.Length == 0)
    {
        return false;
    }
    char[] array = serviceName.ToCharArray();
    for (int i = 0; i < array.Length; i++)
    {
        char c = array[i];
        if (c == '\\' || c == '/')
        {
            return false;
        }
    }
    return true;
}
于 2015-02-25T16:37:33.313 に答える