0

Cコードから呼び出すために使用する.NET COMオブジェクトがあります。

[EventTrackingEnabled(true)]
[ComVisible(true)]
public class ComObject : IComObject
{
    private static XslCompiledTransform transformer = null;
    private static string transformerXsltPath = null;
    private static string TransformerXsltPath 
    {
        get
        {
            return transformerXsltPath;
        }
        set
        {
            transformerXsltPath = value;
        }
    }
    private static XslCompiledTransform Transformer
    {
        get
        {
            return transformer;
        }
        set
        {                
            transformer = value;                
        }
    }

    [ComVisible(true)]
    public bool TransformXML(String inputPath, String xsltPath, String outputPath)
    {       
        // ....
        if (Transformer == null || xsltPath != TransformerXsltPath)
        {
            Transformer = new XslCompiledTransform(true);
            Transformer.Load(xsltPath, new XsltSettings(true, true), new XmlUrlResolver());
        }
        // ...
    }
}

このメソッドを呼び出す限り、com オブジェクトの状態を維持したいと考えています。静的メンバーによって。そのため、もう一度呼び出すと、状態メンバーが初期化されます。

しかし、問題は、Transformerオブジェクトだけが 2 回目の呼び出しで初期化されたままですが、transformerXsltPath文字列が null に再起動されることです。

どのように可能ですか?

4

1 に答える 1

0

まず、メソッド呼び出し間で値を保持するために、フィールドが静的である必要はありません (メソッド内で宣言された変数のみがそのプロパティを持ちます)。静的とは、フィールドがクラスのインスタンスではなくクラスに属していることを意味し、フィールドのインスタンスは 1 つだけであり、クラスのすべてのインスタンスによって共有されます (また、クラスのインスタンスを作成せずにアクセスすることもできます)。 、のようにClass.field)。詳細については、フィールド静的フィールドを参照してください。

2 つ目は、transformerXsltPath フィールドがどこにも変更されていない場合にどのように変更されると期待しているのかわかりません (また、プライベートであるため、クラス外で変更することはできません)。

于 2013-02-28T16:06:06.977 に答える