为什么这里需要引用未使用的程序集

时间:2012-01-15 09:08:14

标签: c# reference

我有一个引用dll的exe。

在dll中有一些方法,我们感兴趣的两个方法是:

private static CacheItemPolicy _policy = new CacheItemPolicy();

[MethodImpl(MethodImplOptions.NoInlining)]
public static void SetValue(string Key, object Value)
{
    SetValue(Key, Value, _policy);
}

[MethodImpl(MethodImplOptions.NoInlining)]
public static void SetValue(string Key, object Value, TimeSpan TTL)
{
    SetValue(Key, Value, GetPolicy(TTL));
}

[MethodImpl(MethodImplOptions.NoInlining)]
private static CacheItemPolicy GetPolicy(TimeSpan TTL)
{
    return new CacheItemPolicy()
    {
        SlidingExpiration = TTL
    };
}

在我尝试调用此方法的exe中:仅使用cache.SetValue(key, item);编译并正常工作,但使用cache.SetValue(key, item, new TimeSpan(0, 1, 0));调用时,我得到以下异常:

  

错误1类型'System.Runtime.Caching.CacheItemPolicy'在未引用的程序集中定义。您必须添加对程序集'System.Runtime.Caching,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用。

为什么编译器说我需要将此引用添加到我目前不在我的代码中直接使用的程序集中?

我确信这很简单,我很想念。我查看了Why do I need to reference a dll which I'm not using directly?,但是它指的是接口,而不是这里的情况。

编辑:还有:

protected static void SetValue(string Key, object Value, CacheItemPolicy Policy)
{
    // work is done here
}

但是这是受保护的,并且不应该对调用exe可见。

Edit2:如果上面SetValueCacheItemPolicy设置为privateinternal,那么它是有效的,为什么protected(和{{ 1}})导致它需要汇编?

1 个答案:

答案 0 :(得分:4)

由于静态SetValue受到保护,因此派生类可以看到它。

所以,如果你可以从类派生(即它是公开的),那么你有可能派生并使用该方法,这意味着需要引用。