Resharper - 转到实现列出了两次引用

13
在我的一个方案中,当我右键单击符号并选择“转到实现”时,针对在另一个解决方案项目中定义的对象,它会列出该引用两次,并强制我选择一个。 根据图标来看,列表中的一项代表了项目,而另一项代表了dll。无论我点击哪个 - 它都会转到同一个源文件。 在这个特定的项目中,我只有一次库引用 - 它正在引用该项目。 是什么导致了这种情况?可能是某种循环引用问题吗?

这个问题很难从你提供的描述中诊断。你能否在http://youtrack.jetbrains.net上详细描述你的情况 - 谢谢! - Dmitri Nesteruk
我有同样的问题。你是否使用EntityFramework或任何可能导致DLL被某些Visual Studio工具加载的技术? - Josh Gallagher
是的,使用EF Code First。 - Shaun Rowan
我也偶尔遇到了同样的问题,而且我也在使用EF Code First... 在之前没有使用EF的项目中,我从未遇到过这个问题... - Tod Thomson
这个文件是否在项目之间作为链接(即添加为链接)? - atomaras
这些答案都在不同的方面有所帮助,但根本问题将在未来再次出现,因为Resharper在构建后再次缓存程序集。从经验上讲,这种情况几乎每天都会发生在我身上。我在JetBrains网站上创建了一个“问题”。如果人们前往那里并投票支持它,这将有助于提高它的优先级。这种缓存也是与重命名功能相关的另一个问题的原因。 - Andrew Steitz
3个回答

2
据我所知,如果您有一个包含多个项目的解决方案,并且某个项目被两个其他项目作为项目和纯文件引用,则也可能发生这种情况。
如果ReSharper出现问题,另一个建议是清除缓存。请注意保留HTML标签。

我如何通过查看现有引用来判断它是作为项目引用还是文件引用?Resharper可以为我添加引用,所以可能它已经以错误的方式完成了。 - Matt Frear
@MattFrear:你需要查看csproj文件。 - Matthias
我清除了%LOCALAPPDATA%\JetBrains\ReSharper中的旧R#版本,然后清除了当前8.2版本中特定解决方案的缓存,在重新启动VS后问题消失了。 - SilverSideDown

2

我遇到了这个问题,然后我解决了它。

首先,尝试进行“清理解决方案”,然后再进行“生成”操作。

在我的情况下,我的解决方案中有一个独立的项目使用了比其他项目旧的.NET框架版本进行编译,所以当Resharper为我添加其他项目的引用时,它必须将其添加为dll引用而不是作为项目引用。

我的解决方法是:

  1. 将旧项目升级到与其他项目相同的.NET框架版本
  2. 从旧项目中删除对其他项目的引用
  3. 再次添加对其他项目的引用(这次作为项目引用)
  4. 清理解决方案
  5. 生成解决方案

完成。


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


        }

    }
}

那段代码是有效的。然而,对我来说更简单和更快的方法是在所有 *.csproj 文件中进行简单的 TargetFrameworkVersion 搜索,并快速浏览所有出现的情况。 - Vladimirs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接