C# 为什么此处需要引用未使用的程序集
我有一个引用dll的exe 在dll中有一些方法,我们感兴趣的两种方法是:C# 为什么此处需要引用未使用的程序集,c#,reference,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); } [MethodImp
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”的引用
为什么编译器会说我需要将这个引用添加到一个程序集,而我现在没有在代码中直接使用这个程序集
我肯定我错过了一些简单的东西。我看了,但它指的是接口,这里不是这样
编辑:还有以下内容:
protected static void SetValue(string Key, object Value, CacheItemPolicy Policy)
{
// work is done here
}
但这是受保护的,调用exe的人不应该看到它
Edit2:当上面的设置值
采用缓存项策略
设置为私有
或内部
时,它会工作,为什么受保护
(和受保护内部
)会导致它需要程序集?既然静态设置值
受到保护,它对派生类可见
因此,如果您可以从类派生(即,它是公共的),那么您就有可能派生并使用该方法,这意味着需要引用。是否有未显示的重载接受/返回CacheItemPolicy?我想知道这是否仅仅是一个重载解析的问题..嗨,Seph,如果你是指我的评论,那是因为受保护的对派生类是可见的。Private表示它仅限于那个特定的类,internal表示它仅限于同一个程序集。您能详细说明一下,尽管代码中没有其他更改,但当仅使用2个参数调用SetValue时,为什么不需要引用吗?据我所知,如何/为什么调用它并不重要。对于其他程序集可见的类的部分包括使用类型CacheItemPolicy,因为该类不是密封的
,并且是公共的
(大概是这样),它邀请类的用户从中派生。如果他们这样做了,那么他们将能够调用SetValue
,该值采用CacheItemPolicy
。这有帮助吗?解决方案:如果您不想让人们从类中派生,请将该类密封起来/使用CacheItemPolicy
将SetValue
重载为私有或内部(如果您从同一引用程序集中的该类派生,则可能是受保护的内部)。在这一点上,可能是因为您正在使用3个参数调用重载,而它不知道什么是CacheItemPolicy
,因此它需要加载定义它的程序集,以便查看通过TimeSpan
的调用是否打算调用基于TimeSpan
的重载或CacheItemPolicy
的重载。(例如,它想确定是否存在从TimeSpan
到CacheItemPolicy
的隐式转换)一种测试方法:您可以向TimeSpan
或CacheItemPolicy
版本的SetValue
添加一个伪参数,这样它们就没有相同数量的参数。