无法将从VSS中的解决方案添加到TFS的源代码管理器中
VSS是一种非常有用的项目文件管理工具,百度百科的解释是:VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取,对开发小组中对源代码的访问进行有效的协调。但是在最近公司选择将TFS作为源代码管理工具,从而进行敏捷开发,所以我就将新的解决方案添加到TFS中,但是总是提示找不到\NBYZGA_Client_20150610\CustomControlLibrary\bin目录,然后就开始查找这个目录,然后查找整个解决方案,最终找不到任何相关的有用信息,那么TFS是从哪里查找到这些信息的呢,后来一个同事告诉我,用记事本打开sln文件,然后找到相关的内容,然后再将其删除掉就可以了,我照做了一下,果然找到了相关的信息:
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Files", "_Files", "{58BF0E02-2D9B-4F2E-BD97-F747ECD5BCFB}" ProjectSection(SolutionItems) = preProject ..\NBYZGA\20151102\NBYZGA_Client_20150610\CustomControlLibrary\bin\Debug\CustomControlLibrary.dll = ..\NBYZGA\20151102\NBYZGA_Client_20150610\CustomControlLibrary\bin\Debug\CustomControlLibrary.dll _Files\DateTimePickerControl.dll = _Files\DateTimePickerControl.dll _Files\Eas.dll = _Files\Eas.dll _Files\EAS.MicroKernel.dll = _Files\EAS.MicroKernel.dll _Files\System.Linq.Expressions.dll = _Files\System.Linq.Expressions.dll _Files\System.ObjectModel.dll = _Files\System.ObjectModel.dll _Files\System.Runtime.dll = _Files\System.Runtime.dll _Files\System.Windows.Interactivity.dll = _Files\System.Windows.Interactivity.dll EndProjectSection
原来当你打开一个解决方案的时候,你所引用的DLL都是程序中通过这些信息来查找的,特别是将一个解决方案添加到TFS的源代码管理器中的时候,首先是从这个路径来查找相关的引用文件的,所以一旦我们将解决方案中相关的文件夹删除掉的话,那么程序就找不到相关的DLL文件。
我们接着来看看sln文件用记事本打开以后有哪些重点的东西:
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChartTest", "Tests\TestApps\ChartTest\ChartTest.csproj", "{173A15C2-D332-4FC2-87FD-0A9E58A431CB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Message", "Modules\Message\Message.csproj", "{2AF19951-02F8-4C05-9E7E-918029BC3B64}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X.Effects", "Public\X.Effects\X.Effects.csproj", "{2D0CD90B-9B16-4B76-A58D-C794A96108B0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tasks", "Modules\Tasks\Tasks.csproj", "{113ED2E9-E680-4BAE-A123-1E5F7530C78A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinForm", "Tests\WinForm\WinForm.csproj", "{23AE97CA-2DB9-4942-ADAA-DA6EE0A1F539}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X.Service.DataExchange.Winform", "Services\X.Service.DataExchange.Winform\X.Service.DataExchange.Winform.csproj", " {C5ABB2FF-0E5E-4459-96A7-326E1ADDB8B4}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Users", "Modules\Users\Users.csproj", "{87F03A58-EB7F-4A86-A27E-7C1C0EA1F189}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DefaultUserRegister", "Modules\DefaultUserRegister\DefaultUserRegister.csproj", "{3B2F034A-310C-4ABD-A96D-4043EC43A948}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Plans", "Modules\Plans\Plans.csproj", "{F5A2C942-0EE9-42AD-A251-32D015C18078}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GQYPGIS", "Apps\GQYPGIS\GQYPGIS\GQYPGIS.csproj", "{D98B2A92-8785-4A8F-B5C3-236A41AB4AC3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{2873314B-0ABA-4E52-9F3B-95D3AEC76D59}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerShell", "Server\ServerShell\ServerShell.csproj", "{FB521BA7-E11A-4782-ACCA-CC5E93716B85}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DLPVideoApp", "Apps\DLPVideoApp\DLPVideoApp.csproj", "{C6B8B748-21DC-4DEF-9C1A-25BF0C7DBC0C}" EndProject
然后对照代码我们会发现,代码中的每一个类库以及相关的文件夹以及其中添加的DLL文件都有唯一的映射,Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerShell", "Server\ServerShell\ServerShell.csproj", "{FB521BA7-E11A-4782-ACCA-CC5E93716B85}"这一句表示 ServerShell这个名称的类库对应"Server\ServerShell\ServerShell.csproj"路径下的这个项目,而且每一个项目对应一个唯一的GUID,这样我们就能通过打开sln文件然后打开所有的解决方案下面的类库以及其他的文件。
还是回到上面的代码,为什么程序提示找不到CustomControlLibrary.dll 这个DLL,因为我们将其他类库生成的这个dll直接放到了bin\Debug这个目录下,然后直接引用这个目录下的DLL,这样在我们每次保存解决方案的时候,相关的DLL信息就被保存到了sln文件中,从而便于下次进行查找,这样做在平时是没有什么问题的,因为所有引用的DLL都会默认复制到输出目录,但是这种做法在将解决方案添加到VSS或者TFS中就会出问题,因为这些源代码管理器是不会讲bin及其子目录添加到源代码管理器中的,所以别人在获取这些源代码的时候也是无法获取bin目录的,所以当别人打开解决方案时就会找不到当前引用的DLL,所以在写代码时一定要养成很好的习惯,在解决方案下建一个专门存放引用DLL的文件夹,然后从这个位置去引用,这是一个非常重要的习惯。
另外在我们的代码中我们经常会编译成不同的版本,有时一不小心就会删掉重要的文件,所以这些小习惯非常重要,希望能够引起所有人的重视。