対応する VS dev チケットがあります https://connect.microsoft.com/VisualStudio/feedback/details/817276/error-cs0012-the-type-is-defined-in-an-assembly-that-is-not-referenced -使用されていない拡張メソッドに対して発行された
私は2つの拡張方法を持っています:
public static class ExtensionMethods
{
public static string GetClientIpAddress(this HttpRequestBase request)
{
// ...
}
public static string GetClientIpAddress(this HttpRequestMessage request)
{
// ...
}
}
クラスHttpRequestMessage
はSystem.Net.Http
アセンブリにHttpRequestBase
あり、System.Web
(つまり、異なるアセンブリに) あります。クラスExtensionMethods
はProjectAとしましょう。
このプロジェクトはうまくコンパイルされ、問題はありません。
次に、次のようにGetClientIpAddress(this HttpRequestBase request)
、別のプロジェクト (たとえばProjectB )の最初のメソッドを使用します。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var sessionContext = DependencyResolver.Current.GetService<ISessionContext>();
// Call to GetClientIpAddress
sessionContext.ClientIpAddress =
filterContext.HttpContext.Request.GetClientIpAddress();
}
ProjectB には既に への参照がありますがSystem.Web
、コンパイルしようとすると、コンパイル エラーが発生します。
タイプ '
System.Net.Http.HttpRequestMessage
' は、参照されていないアセンブリで定義されています。アセンブリ ' ' への参照を追加する必要がありますSystem.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
。
私が理解できないのは、なぜ への参照を追加する必要があるのかということSystem.Net.Http
です。
コンパイラが 2 番目の方法を使用しようとしているようで、GetClientIpAddress(this HttpRequestMessage request)
これによりアセンブリへの参照が失われます。これはバグですか?
最初のメソッドの名前を変更すると (つまり、オーバーロードを取り除くと)、すべてがうまくコンパイルされます。