13

私のソリューションの 1 つで、シンボルを右クリックして、他のソリューション プロジェクトの 1 つで定義されたオブジェクトの [実装に移動] を選択すると、参照が 2 回リストされ、いずれかを選択するように強制されます。

アイコンに基づいて、リスト内の項目の 1 つはプロジェクトを表し、もう 1 つは dll を表しているように見えます。どちらをクリックしても同じソース ファイルに移動します。

私はこの特定のプロジェクトで一度だけライブラリ参照を持っています - それはプロジェクトを参照しています。

これが起こる原因は何ですか?おそらくある種の循環参照の問題ですか?

4

3 に答える 3

2

私が知る限り、これは、特定のプロジェクトがプロジェクトとして参照され、ソリューション内の他の 2 つのプロジェクトによって純粋なファイルとして参照される、複数のプロジェクトを含むソリューションがある場合にも発生する可能性があります。

ReSharper で何かが壊れた場合に私ができるもう 1 つのアドバイスは、キャッシュをクリアすることです。

于 2013-10-27T04:16:27.637 に答える
2

私はこの問題を抱えていたので、それを修正しました。

まず、Clean Solution を実行してから Build を実行してみてください。

私の場合、私のソリューションの不正なプロジェクトの 1 つが、他のプロジェクトよりも古いバージョンの .NET フレームワークを使用してコンパイルされていたため、Resharper が私の他のプロジェクトへの参照を追加したとき、それを dll 参照としてではなく dll 参照として追加したに違いありません。プロジェクトの参照として。

私の修正は

  1. 古いプロジェクトを他のプロジェクトと同じバージョンの .NET Framework にアップグレードする
  2. その古いプロジェクトから他のプロジェクトへの参照を削除します
  3. 他のプロジェクトへの参照を再度追加します (今回はプロジェクト参照として)
  4. クリーン ソリューション
  5. ビルド ソリューション

終わり。

于 2014-01-30T21:24:20.567 に答える
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;
                    }
                }
            }


        }

    }
}
于 2014-11-26T21:58:37.603 に答える