Resharper - 两次转到实施列表参考

时间:2013-06-18 01:55:11

标签: c# resharper

在我的一个解决方案中,当我右键单击一个符号并为其他一个解决方案项目中定义的对象选择“Go To Implementation”时,它会列出两次引用,并强制我选择一个。

根据图标,列表中的一个项目表示项目,另一个表示dll。我点击哪一个并不重要 - 它会转到同一个源文件。

我在这个特定项目中只有一次库引用 - 它引用了项目。

会导致这种情况发生的原因是什么?某种循环参考问题或许?

3 个答案:

答案 0 :(得分:2)

据我所知,如果您有一个包含多个项目的解决方案,其中某个项目被引用为项目,并且该解决方案中的另外两个项目也将其作为纯文件,也会发生这种情况。

如果ReSharper出现问题,我可以给出的另一个建议是clear the cache

答案 1 :(得分:2)

我遇到了这个问题,我刚修好了。

首先,尝试使用Clean Solution然后进行Build。

就我而言,我的解决方案中的一个流氓项目是使用旧版本的.NET框架而不是其他项目编译的,所以当Resharper为我添加了对其他项目的引用时,它必须将它添加为dll引用而不是项目引用。

我的修复是

  1. 将旧项目升级到与其他项目相同的.NET框架版本
  2. 从旧项目中删除对其他项目的引用
  3. 再次添加对其他项目的引用(此次为Project引用)
  4. 清洁解决方案
  5. 构建解决方案
  6. 完成。

答案 2 :(得分:1)

我发现了几个导致这个问题的不同案例,并且非常恼火,我写了一个小控制台应用程序来扫描我的解决方案并为我找到问题。这是适合任何可能发现这个有用的人。要运行它,请将其传递给解决方案文件夹的路径,它将在控制台上打印出问题。它非常快速而且肮脏"但它为我找到了问题。

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;
                    }
                }
            }


        }

    }
}