2011-09-18 28 views
9

Chúng tôi đang phát triển một ứng dụng C# tham khảo một vài thư viện COM (ví dụ: AutoIT).Đăng ký COM tham chiếu DLL trên máy chủ xây dựng

Tôi bao gồm tất cả các thành phần được tham chiếu trong điều khiển nguồn, trong thư mục "Libs" của bên thứ 3.

Vấn đề là COM dll không có thuộc tính HintPath trong tệp .csproj và tôi giả sử chúng phải được đăng ký theo cách thủ công bằng cách sử dụng regsvr32 (hoặc sử dụng tập lệnh sắp xếp).

Tôi hiện đang xem xét việc tạo tập lệnh MSBuild sẽ chạy trước mỗi lần xây dựng, tuy nhiên tôi không thể tìm ra liệu tôi có nên tự gọi regsvr32.exe hay sử dụng một số tác vụ MSBuild được xác định trước không?

Hiện nay, đây là những gì tôi đã attmpted như một thử nghiệm:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> 
    <ItemGroup> 
    <MyAssemblies Include="D:\*.dll" /> 
    </ItemGroup> 
    <Target Name="Build"> 
    <RegisterAssembly 
     Assemblies="@(MyAssemblies)" > 
    </RegisterAssembly> 
    </Target> 
</Project> 

này tạo ra lỗi các file DLL tôi đã đặt trong thư mục nhất định là không hợp lệ DLLs.

Giải pháp tốt cho vấn đề này là gì?

EDIT:

Các dự án tham khảo COM dlls có một cái gì đó tương tự như sau trong file csproj:

<COMReference Include="AutoItX3Lib"> 
     <Guid>{F8937E53-D444-4E71-9275-35B64210CC3B}</Guid> 
     <VersionMajor>1</VersionMajor> 
     <VersionMinor>0</VersionMinor> 
     <Lcid>0</Lcid> 
     <WrapperTool>tlbimp</WrapperTool> 
     <Isolated>False</Isolated> 
    </COMReference> 

này không bao gồm bất kỳ đường dẫn gợi ý như hội đồng quản lý khác, vì vậy trên một máy chủ xây dựng , Dll COM tham chiếu không được tìm thấy.

Khi đăng ký dll COM trên máy chủ xây dựng bằng REGSVR32, quá trình xây dựng thành công.

Trả lời

10

Bạn không đăng ký máy chủ COM trên một máy chủ xây dựng. Điều đó chỉ bắt buộc khi bạn thực sự muốn chạy mã được biên dịch. Những gì bạn cần là các loại thư viện cho các máy chủ COM, do đó bạn có thể nhận được các hội đồng interop. Mà bạn tạo với Tlbimp.exe.

Cho dù bạn muốn chạy Tlbimp trên máy chủ xây dựng hoặc lên phía trước trên máy dev phụ thuộc rất nhiều vào cách bạn triển khai các máy chủ COM này. Giữ một bản sao của các tập tin thực thi COM và các tập tin .tlb rất gần với các thư viện interop của bạn là một ý tưởng tốt. Nói cách khác, hãy kiểm tra chúng.Trình cài đặt hiện có thể truy xuất phiên bản đã biết của máy chủ COM.

+0

Tôi có cả hai loại thư viện và các hội đồng interop kiểm tra vào kiểm soát nguồn của tôi (Git). Tham khảo interop là không đủ mặc dù. Đầu ra của Tlbimp là gì? tôi thay vì làm điều đó như là một phần của quá trình xây dựng chứ không phải lên phía trước, vì khi nâng cấp build env, tôi có thể sao chép tất cả các script và mở rộng đến nhiều máy chủ hơn và có tất cả logic được lưu trữ ở đó mà không có các bước điều kiện tiên quyết –

+0

Đầu ra của Tlbimp là lắp ráp interop. Tôi không thể làm bất cứ điều gì với "là không đủ", bạn sẽ phải mô tả các lỗi xây dựng bạn nhận được tốt hơn. –

+0

tôi đã cập nhật câu hỏi ban đầu của mình. Interop dll tồn tại trong thư mục "dependencies", tuy nhiên không có liên kết giữa tệp .csproj và tệp này, do đó, bản dựng không chọn tệp này. Trên envinronment dev của tôi, điều này hoạt động tốt như tôi đã cài đặt gói phần mềm ban đầu (ví dụ AutoIt), tuy nhiên trên máy chủ xây dựng này không được cài đặt và do đó việc xây dựng không thành công mà không thực hiện thêm một số bước trước khi biên dịch .. –

0

1) Cố gắng tham chiếu các thư viện COM vào csproj của bạn dưới dạng tham chiếu - nếu bạn chưa làm như vậy.

2) Cố gắng thêm vào tập tin csproj của bạn:

<Project ... > 
    ... 
    <Target Name="BeforeBuild"> 
     <Exec Command="regsvr32.exe yourComponent.dll" /> 
    </Target> 
</Project> 

PS: nếu bạn đang sử dụng một số loại phần mềm xây dựng máy chủ bạn không nên thay đổi csproj nhưng kịch bản được sử dụng bởi việc xây dựng tại máy chủ.

+0

Cảm ơn câu trả lời. Tôi không muốn thay đổi các tệp .csproj, nhưng thay vào đó có một tập lệnh "chuẩn bị" để thực hiện công việc này. Tôi muốn chạy regsvr32.exe trên tất cả các hội đồng (có thể đặt tất cả các tài liệu tham khảo COM dưới một thư mục duy nhất và chạy nó trên chúng). Làm thế nào để tôi lặp lại trên tất cả chúng từng cái một trong MSBuild mặc dù. –

+0

Tôi tin rằng tôi đã tìm thấy giải pháp - sử dụng ký hiệu% (MyAssemblies.Identity) sẽ chạy lệnh một lần cho mỗi tệp được mở rộng khi sử dụng * .dll. Đây có phải là cách sử dụng đúng và phổ biến không? –

+0

Tôi không thực sự hiểu bạn giải pháp với% (MyAssemblies.Identity) như bạn đang cố gắng sử dụng COM dlls. Nhưng để lặp qua các tệp danh sách, bạn có thể sử dụng 'for' trong dòng lệnh nếu bạn muốn: để tìm hiểu cách sử dụng nó - chỉ cần gõ 'for /? > yourTargetPath \ help_for_for.txt 'và đọc tệp txt đã tạo. –

0

Tôi không chắc chắn, nếu có bất kỳ nhiệm vụ nào trong MSBuild, để gọi regsvr32, nhưng REgisterAssembly đang gọi regasm.exe - nghĩa là - đăng ký thành phần .NET cho COM interop.

Tôi chắc chắn rằng, chỉ cần gọi regsvr32 theo cách thủ công sẽ là cách nhanh nhất để đạt được kết quả mong muốn.

Một điều nữa - điều gì sẽ xảy ra nếu COM DLL đã được đăng ký trước đó và bạn sẽ chạy tập lệnh xây dựng của mình một lần nữa? (Tôi thực sự không biết làm thế nào các regsvr32 sẽ phản ứng, chỉ là một ý nghĩ ở đây)

+0

Gọi lại regsvr32 là vô hại (AFAIK), ngoại trừ lãng phí X mili giây thời gian. –

11

Đối với câu trả lời ban đầu của tôi cho một câu hỏi tương tự xem: TFS Build server and COM references - does this work?

Một lựa chọn tốt hơn cho xây dựng các máy chủ có thể sử dụng COMFileReference mục trong tập tin dự án của bạn thay vì COMReference. Một ví dụ sẽ trông giống như sau:

<ItemGroup> 
    <COMFileReference Include="MyComLibrary.dll"> 
    <EmbedInteropTypes>True</EmbedInteropTypes> 
    </COMFileReference> 
</ItemGroup> 

Dll COM không cần phải được đăng ký trên máy để làm việc này.

Mỗi mục COMFileReference cũng có thể có thuộc tính WrapperTool nhưng mặc định có vẻ hoạt động tốt. Thuộc tính EmbedInteropTypes không được ghi nhận là có thể áp dụng cho COMFileReference, nhưng nó có vẻ hoạt động như dự định.

Xem http://msdn.microsoft.com/en-us/library/bb629388.aspx để biết thêm chi tiết. Mục MSBuild này đã có sẵn từ .NET 3.5.

+0

BTW, có vẻ như HintPath hoạt động cho tác vụ COMReference cũng như mặc dù nó không được ghi lại. – jpierson

+0

HintPath không làm việc cho tôi trong COMReference, nhưng tôi có thể sử dụng một đường dẫn trong thuộc tính Include của COMFileReference. – kristianp

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