在我的一个解决方案中,当我右键单击一个符号并为在其他解决方案项目之一中定义的对象选择“转到实现”时,它会列出两次引用并强制我选择一个。
根据图标,列表中的一项似乎代表项目,另一项代表一个 dll。我点击哪一个并不重要——它会转到同一个源文件。
我在这个特定项目中只有一次库引用 - 它正在引用该项目。
什么会导致这种情况发生?也许是某种循环引用问题?
我遇到了这个问题,我刚刚修复了它。
首先,尝试做一个干净的解决方案,然后是一个构建。
就我而言,我的解决方案中的一个流氓项目是使用比其他项目更旧版本的 .NET 框架编译的,因此当 Resharper 为我添加对我的其他项目的引用时,它必须将其添加为 dll 引用而不是作为项目参考。
我的解决办法是
完毕。
据我所知,如果您有一个包含多个项目的解决方案,其中某个项目被引用为项目,并且解决方案中的其他两个项目也作为纯文件引用,这也可能发生。
如果 ReSharper 出现问题,我可以给出的另一个建议是清除缓存。
我发现了几个导致此问题的不同案例,并且非常恼火,以至于我编写了一个小控制台应用程序来扫描我的解决方案并为我找到问题。这里适用于任何可能觉得这很有用的人。要运行它,将路径传递到您的解决方案文件夹,它将在控制台上打印出问题。它非常“快速而肮脏”,但它为我找到了问题。
class Program
{
static void Main(string[] args)
{
if (args != null && args.Any())
{
foreach (var s in args)
{
Console.WriteLine("Checking " + s);
DirectoryInfo dir = new DirectoryInfo(s);
var files = dir.GetFiles("*.csproj", SearchOption.AllDirectories);
var projects = files.Select(x => new Project(x)).ToList();
var grouped = projects.GroupBy(x => x.TargetFrameworkVersion);
if(grouped.Count()>1)
{
Console.WriteLine("Solution contains multiple versions of Target Frameworks, this may cause duplicate assemblies in R# cache");
foreach (var group in grouped)
{
Console.WriteLine(group.Key);
foreach (var project in group)
{
Console.WriteLine(project.AssemblyName);
}
}
}
//loop through for debugging
foreach (var project in projects)
{
foreach (var reference in project.References)
{
foreach (var checkProject in projects)
{
if (checkProject.AssemblyName == reference)
{
Console.WriteLine("Reference in" + project.FileName + " referencing " +
reference+" that should be a ProjectReference, this may cause duplicate entries in R# Cache");
}
}
}
}
}
Console.WriteLine("Complete");
Console.ReadLine();
}
else
{
Console.WriteLine("You must provide a path to scan for csproj files");
}
}
}
public class Project
{
public string FileName { get; set; }
public string AssemblyName { get; set; }
public string ProjectGuid { get; set; }
public string TargetFrameworkVersion { get; set; }
public IList<string> References { get; set; }
private FileInfo _file;
private XmlDocument _document;
private XmlNamespaceManager _namespaceManager;
public Project(FileInfo file)
{
_file = file;
FileName = _file.FullName;
_document = new XmlDocument();
_document.Load(_file.FullName);
_namespaceManager = new XmlNamespaceManager(_document.NameTable);
_namespaceManager.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
var projectGuidNode = _document.SelectSingleNode("//msbld:ProjectGuid", _namespaceManager);
ProjectGuid = projectGuidNode.InnerText;
var assemblyNameNode = _document.SelectSingleNode("//msbld:AssemblyName", _namespaceManager);
AssemblyName = assemblyNameNode.InnerText;
var targetFrameworkNode = _document.SelectSingleNode("//msbld:TargetFrameworkVersion", _namespaceManager);
TargetFrameworkVersion = targetFrameworkNode.InnerText;
References = new List<string>();
var referenceNodes = _document.SelectNodes("//msbld:Reference", _namespaceManager);
foreach (var node in referenceNodes)
{
var element = (XmlElement) node;
//file references
if (element.HasChildNodes)
{
foreach (var child in element.ChildNodes)
{
var childElement = (XmlElement)child;
if (childElement.Name == "HintPath")
{
var value = childElement.InnerText;
value = value.Substring(value.LastIndexOf("\\") + 1);
value = value.Replace(".dll", "");
References.Add(value);
}
}
}
//gac references
else
{
foreach (var attr in element.Attributes)
{
var attribute = (XmlAttribute)attr;
if (attribute.Name == "Include")
{
var value = attribute.Value;
string reference = value;
if (value.Contains(','))
{
reference = value.Substring(0, value.IndexOf(','));
}
References.Add(reference);
break;
}
}
}
}
}
}