6

Câu hỏi này có thể đã được hỏi nhiều lần và có thể tôi chỉ sử dụng chức năng tìm kiếm ở đây tốt như google nhưng tôi chưa tìm thấy câu trả lời cho câu hỏi này.DLL được tham chiếu không được sao chép để tham chiếu dự án

Tôi hiện đã có hai dự án, dự án X, dự án Y và Z dự án (mà chỉ giữ ánh xạ)

Project X là một dự án FluentNhibernate nắm giữ sessionfactories và đồ đạc của tôi như thế này. Vì vậy, đây cũng là nơi ánh xạ được tải và mọi thứ (điều này quan trọng và tôi nghi ngờ đó có thể là toàn bộ lý do cho vấn đề tôi gặp phải)

Bây giờ trong Project X Tôi đã tham chiếu một hội đồng sử dụng Microsoft. SqlServer.Types.dll.

Dự án Y là dịch vụ sử dụng dự án X cho các kết nối cơ sở dữ liệu của nó.

Tất cả các tìm kiếm xây dựng tìm và chạy hoàn hảo trên máy phát triển của tôi, tuy nhiên khi được triển khai cho máy chủ của chúng, chúng không hoạt động (lỗi thời gian chạy). Lỗi này khá mơ hồ vì nó chỉ ra một cụm FluentNHibernate bị thiếu mà không phải là trường hợp.

Procmon.exe may mắn cho thấy mã đang cố gắng tải Microsoft.SqlServer.Types.dll vì máy chủ không có SQL Server được cài đặt (máy khách của tôi không hoặc nhưng nó có một studio quản lý có nhiều khả năng cài đặt này .DLL cũng vậy).

Cho đến giờ rất tốt, đã sao chép tệp DLL lên và nó hoạt động (yay!).

Bây giờ tôi đã tìm tôi đã thêm assembly vào dự án X để đảm bảo rằng tham chiếu này được sao chép sang các dự án khác bằng cách sử dụng dự án X. Điều này không xảy ra .... Vì vậy, tôi đã thử đặt 'Sao chép cục bộ' đặt thành true.

Đáng buồn là điều này vẫn không sao chép .dll vào Y. dự án tham khảo

Có cách nào để làm cho điều này xảy ra hoặc là Visual Studio này beeing thông minh và thực hiện Dự án Y không cần .dll này và do đó từ chối sao chép nó?

(Kể từ khi dự án Z cần tài liệu tham khảo thực tế và dự án X tải này thời gian lắp ráp @ chạy không có tài liệu tham khảo 'cứng' giữa Z và X)

thể bất kỳ thiên tài Stackoverflow làm sáng tỏ về vấn đề này kể từ khi thành thật tôi Tôi muốn biết lý do tại sao nó hoạt động theo cách này (và lý tưởng là một cách để làm cho nó hoạt động như tôi muốn nó).

Trả lời

1

Bây giờ tôi đã tìm tôi sẽ thêm assembly vào dự án X để đảm bảo rằng tham chiếu này được sao chép sang các dự án khác bằng cách sử dụng dự án X. Điều này đã không xảy ra .... Vì vậy, tôi đã thử đặt 'Sao chép địa phương 'đặt thành true.

Bạn vẫn đang nói về Microsoft.SqlServer.Types.dll phải không?

Tôi đã gặp sự cố tương tự cách đây một thời gian, các loại sqlserver thực sự không được sao chép và phân phối lại với quá trình cài đặt của bạn. Cách chính xác để "cài đặt" nó là tải về thời gian chạy máy chủ sql (được bao gồm trong các công cụ quản lý máy chủ sql, đó là lý do tại sao nó hoạt động cho bạn tại địa phương).

Vì đã lâu rồi, tôi không chắc chắn 100% nếu thông tin sau là chính xác và sẽ hoạt động, nhưng chỉ cần cài đặt chỉ Microsoft® System CLR Types for Microsoft® SQL Server® 2012. Trên trang tải xuống này, hãy mở rộng Hướng dẫn Cài đặt và cuộn xuống các loại Tải xuống CLR ...

Sử dụng this link for SQL Server 2008

Cài đặt ứng dụng này trên máy chủ đích. Điều này sẽ chỉ cài đặt những thứ cần thiết để chạy loại này ...

+0

tôi vẫn đang nói về Microsoft.SqlServer.Types.dll vâng. Nhưng tại sao sẽ phân phối nó với phần mềm thực sự của bạn là xấu trong trường hợp này? Có một số điều thực hành tốt nhất tại nơi làm việc ở đây không? –

+0

Các loại dll chỉ là một wrapper xung quanh dlls cũng được sử dụng bởi SQL Server chính nó để làm các hoạt động không gian ... những dlls được viết bằng C/C++ và không được sao chép nếu bạn chỉ cần sao chép trên các loại dll ... bạn cũng có thể gây ra cũng sao chép SQLServerSpatial.dll (đó là dll bản địa) – MichaC

+0

Vâng tôi đang sử dụng các loại mã nguồn bằng văn bản của một phần ba mà tôi đã thay đổi để sử dụng thông thạo nhibernate với thông tin địa lý và sql server 2012 Dialect. Tuy nhiên, việc cài đặt các loại CLR cho mỗi thông tin bạn cung cấp có vẻ hoạt động. Vì vậy, tôi sẽ làm một vài bài kiểm tra nữa và nếu những thành công đó tôi sẽ đánh dấu câu trả lời của bạn. Điều đó nói rằng tôi nghi ngờ studio trực quan từ chối sao chép DLL do họ beeing được viết bằng C/C++. Vấn đề cơ bản vẫn là viết tắt và tôi rất thích một câu trả lời ở đây tuy nhiên những người khác tìm cách của họ ở đây vì Microsoft.SqlServer.Types.dll nên sử dụng trình cài đặt. –

7

Câu hỏi này đã được trả lời nhưng tôi đã tính đến phương pháp không an toàn chung để sao chép tất cả các tham chiếu gián tiếp vào thư mục đầu ra của dự án.

  1. Set Copy địa phương để đúng cho tất cả các tài liệu tham khảo bạn muốn được bao gồm với đầu ra của bạn.
  2. Lưu bản sao mã phụ thuộc gián tiếp (xem bên dưới) vào tệp có tên CopyIndirectDependencies.targets và đặt tệp đích vào thư mục dự án của bạn.
  3. Chỉnh sửa .csproj hoặc .vbproj để bao gồm một lần nhập vào tệp .targets bạn đã thêm. Xem ví dụ bên dưới.
  4. Xây dựng dự án của bạn và bạn sẽ có phụ thuộc thứ cấp được sao chép tự động vào đầu ra xây dựng.

CopyIndirectDependencies.targets Nội dung file dự án

<?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> 

mẫu với nhập khẩu

<?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> 

Nguồn:http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html

+0

Có quan trọng nơi dòng trong bước 3 được thêm vào trong tệp dự án? Ví dụ, nó có phải là dưới mục tiêu Sau khi xây dựng hoặc ở một nơi khác (hoặc bất kỳ nơi nào)? – longda

+4

Hmm, điều này không hoạt động trong Visual Studio 2012. Tôi hy vọng tôi sai. – longda

+0

@longda: Xem bài viết tôi có nguồn gốc câu trả lời này cho. Nó có một dự án mẫu. –

Các vấn đề liên quan