这个问题可能已被多次询问过,也许我只是擅长使用搜索功能以及谷歌,但我还没有找到这个问题的答案。
我目前有两个项目,项目X,项目Y和项目Z(仅包含映射)
Project X是一个FluentNhibernate项目,它保存了我的sessionfactories和类似的东西。所以这也是映射加载和事物的地方(这很重要,我怀疑它可能是我遇到的问题的全部原因)
现在,在Project X中,我引用了一个使用Microsoft.SqlServer.Types.dll。
的程序集项目Y是一个使用项目X进行数据库连接的服务。
所有的probjects都可以在我的开发机器上完美地查找和运行,但是当部署到我们的服务器时,它们无法正常运行(运行时错误)。错误是非常模糊的,因为它指向缺少FluentNHibernate程序集,但事实并非如此。
Procmon.exe幸运地显示代码试图加载Microsoft.SqlServer.Types.dll,因为服务器没有安装SQL Server(我的客户端也没有,但它有一个管理工作室,很可能安装它。 DLL以及。)
到目前为止一直很好,复制了DLL并且它工作了(是的!)。
现在我想我将程序集添加到项目X以确保使用项目X将此引用复制到其他项目。这没有发生....所以我尝试设置'复制本地'设置为真。
遗憾的是,这仍然没有将.dll复制到引用项目Y。
有没有办法让这种情况发生,或者这个Visual Studio是否聪明并且意识到Project Y不需要这个.dll而拒绝复制它?
(由于Project Z需要实际引用而Project X加载此程序集@ run time,因此Z和X之间没有“硬”引用)
任何Stackoverflow天才都可以对此有所了解,因为老实说,我想知道为什么它会以这种方式运行(理想情况下是一种使其表现得像我想要的那样)。
答案 0 :(得分:7)
这个问题已经得到了解答,但我想我将包含一个通用的故障安全方法,用于将所有间接引用复制到项目的输出目录中。
CopyIndirectDependencies.targets
的文件中,并将目标文件放在项目目录中。.csproj
或.vbproj
以包含对您添加的.targets
文件的导入。见下面的例子。CopyIndirectDependencies.targets 文件内容
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CopyIndirectDependencies
Condition="'$(CopyIndirectDependencies)'==''">true</CopyIndirectDependencies>
<CopyIndirectDependenciesPdb
Condition="'$(CopyIndirectDependenciesPdb)'==''">false</CopyIndirectDependenciesPdb>
<CopyIndirectDependenciesXml
Condition="'$(CopyIndirectDependenciesXml)'==''">false</CopyIndirectDependenciesXml>
</PropertyGroup>
<!-- BuildXxx part -->
<Target Name="CopyIndirectDependencies"
Condition="'$(CopyIndirectDependencies)'=='true'"
DependsOnTargets="DetectIndirectDependencies">
<Copy Condition="'%(IndirectDependency.FullPath)'!=''"
SourceFiles="%(IndirectDependency.FullPath)"
DestinationFolder="$(OutputPath)"
SkipUnchangedFiles="true" >
<Output TaskParameter="CopiedFiles"
ItemName="IndirectDependencyCopied" />
</Copy>
<Message Importance="low"
Condition="'%(IndirectDependencyCopied.FullPath)'!=''
and '%(IndirectDependencyCopied.Extension)'!='.pdb'
and '%(IndirectDependencyCopied.Extension)'!='.xml'"
Text="Indirect dependency copied: %(IndirectDependencyCopied.FullPath)" />
</Target>
<Target Name="DetectIndirectDependencies"
DependsOnTargets="ResolveAssemblyReferences">
<Message Importance="low"
Text="Direct dependency: %(ReferencePath.Filename)%(ReferencePath.Extension)" />
<Message Importance="low"
Text="Indirect dependency: %(ReferenceDependencyPaths.Filename)%(ReferenceDependencyPaths.Extension)" />
<!-- Creating indirect dependency list -->
<CreateItem Include="%(ReferenceDependencyPaths.FullPath)"
Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true'">
<Output TaskParameter="Include"
ItemName="_IndirectDependency"/>
</CreateItem>
<CreateItem Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).xml"
Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true' and '$(CopyIndirectDependenciesXml)'=='true'">
<Output TaskParameter="Include"
ItemName="_IndirectDependency"/>
</CreateItem>
<CreateItem Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).pdb"
Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true' and '$(CopyIndirectDependenciesPdb)'=='true'">
<Output TaskParameter="Include"
ItemName="_IndirectDependency"/>
</CreateItem>
<!-- Filtering indirect dependency list by existence -->
<CreateItem Include="%(_IndirectDependency.FullPath)"
Condition="Exists('%(_IndirectDependency.FullPath)')">
<Output TaskParameter="Include"
ItemName="IndirectDependency"/>
</CreateItem>
<!-- Creating copied indirect dependency list -->
<CreateItem Include="@(_IndirectDependency->'$(OutputPath)%(Filename)%(Extension)')">
<Output TaskParameter="Include"
ItemName="_ExistingIndirectDependency"/>
</CreateItem>
<!-- Filtering copied indirect dependency list by existence -->
<CreateItem Include="%(_ExistingIndirectDependency.FullPath)"
Condition="Exists('%(_ExistingIndirectDependency.FullPath)')">
<Output TaskParameter="Include"
ItemName="ExistingIndirectDependency"/>
</CreateItem>
</Target>
<!-- Build sequence modification -->
<PropertyGroup>
<CoreBuildDependsOn>
$(CoreBuildDependsOn);
CopyIndirectDependencies
</CoreBuildDependsOn>
</PropertyGroup>
</Project>
带导入的示例项目
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="CopyIndirectDependencies.targets" /> <!-- ADD THIS LINE!! -->
...
</Project>
来源: http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html
答案 1 :(得分:2)
现在我想我将程序集添加到项目X以确保使用项目X将此引用复制到其他项目。这没有发生....所以我尝试设置'复制本地'设置为true。
您还在谈论Microsoft.SqlServer.Types.dll吗?
前段时间我遇到了同样的问题,实际上不应该复制sqlserver类型并重新分配你的安装。 “安装”它的正确方法是下载sql server运行时(它包含在sql server管理工具中,这就是它在本地适用的原因)。
因为它是在不久前,我不是100%确定以下信息是否正确并且可行,但只是尝试仅安装Microsoft® System CLR Types for Microsoft® SQL Server® 2012。在此下载页面上展开“安装说明”并向下滚动到“CLR类型下载...”
使用this link for SQL Server 2008
在目标服务器上安装它。这只会安装运行此类型dll所需的东西...
答案 2 :(得分:1)
可能是微软的答案会很有用: {{3P>