2009-07-23 35 views
33

Tôi có một thư viện lớp đơn giản được viết bằng C#.Một đơn giản C# DLL - làm thế nào để tôi gọi nó từ Excel, Access, VBA, VB6?

using System; 
namespace TestDll 
{ 
    public class Test 
    { 
     public string HelloWorld 
     { 
      get 
      { 
       return "Hello World"; 
      } 
     } 
    } 
} 

Câu hỏi của tôi là làm cách nào để gọi hàm HelloWorld này từ Microsoft Office Visual Basic (mà tôi nghĩ là VB6)?

Bước đầu tiên của tôi là thêm DLL làm tham chiếu - nhưng khi duyệt và chọn DLL đã biên dịch, thông báo "Không thể thêm tham chiếu vào tệp được chỉ định". đã bị ném.

Bất cứ ai có thể chỉ cho tôi đúng hướng là tại sao/làm thế nào để làm việc này?

Cảm ơn bạn trước SO!

+0

Trao đổi thẻ dllimport cho thẻ interop ... – Ant

Trả lời

47

Bạn không thể truy cập thành viên tĩnh thông qua COM interop. Trong thực tế, mã của bạn thậm chí không biên dịch, phương thức nên ở trong một lớp. Dưới đây là cách bạn có thể thực hiện:

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[Guid("01A31113-9353-44cc-A1F4-C6F1210E4B30")] //Allocate your own GUID 
public interface _Test 
{ 
    string HelloWorld { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("E2F07CD4-CE73-4102-B35D-119362624C47")] //Allocate your own GUID 
[ProgId("TestDll.Test")] 
public class Test : _Test 
{ 
    public string HelloWorld { get { return "Hello, World! "; } } 
} 

Thuộc tính dự án Tab xây dựng, chọn Đăng ký COM interop. Vì vậy, bạn có thể xem kết quả nhanh chóng. Để cài đặt dll trên máy khác, bạn cần sử dụng regasm.

Để sau đó tiêu thụ này:

Dim o : Set o = CreateObject("TestDll.Test") 
MsgBox o.HelloWorld 

Bạn cũng có thể tham khảo các dll và sử dụng đầu ràng buộc:

Dim o As TestDll.Test 
Set o = New TestDll.Text 
MsgBox o.HelloWorld 
+0

cảm ơn AnthonyWJones, một câu trả lời thực sự hay - Tôi đã tìm kiếm từ khi đăng câu trả lời này - phát hiện ra mọi thứ ngoại trừ việc tôi phải khai báo giao diện! Cám ơn rất nhiều!! – divinci

+0

Nó có thể được thực hiện mà không khai báo một giao diện nhưng tôi sẽ không khuyên bạn nên sử dụng một giao diện đặc biệt để được tiêu thụ bởi một khách hàng COM là một cách tốt hơn để làm điều này. – AnthonyWJones

+0

Cảm ơn Anthony, bạn có phiền khi phê bình câu trả lời tiếp theo mà tôi đã đăng không? – divinci

0

Để thêm vào câu trả lời tốt AnthonyWJones, bạn cũng sẽ cần phải đăng ký DLL của bạn sử dụng Regasm.exe để thêm các mục đăng ký cần thiết.

+0

Xin lỗi, không nhận thấy rằng AnthonyWJones đã đề cập đến Regasm. –

19

Và để mở rộng đăng ký DLL trên các máy tính khác nhau.

Khi bạn biên dịch và xây dựng mã ở trên vào máy phát triển của bạn, nếu bạn có

Các tính chất dự án tab Build, chọn Đăng ký cho COM interop.

thư mục đầu ra Visual Studio của bạn (thường là bin \ Debug) nơi tệp * .dll được tìm thấy cũng sẽ có tệp * .tlb.

Tệp * .tlb này là 'Loại thư viện'. Và là cần thiết bởi máy khách để hiểu khác nhau 'Loại' trong * .dll của bạn và về cơ bản cho máy khách biết làm thế nào để sử dụng nó.

Bằng cách đặt 'Đăng ký cho COM interop' ở trên - cũng như tệp * .tlb được tạo, cụm (dll) được đăng ký trên máy của bạn và do đó có thể truy cập được.

Trong VBA bây giờ bạn có thể thêm tập tin này như một tham chiếu bởi

VBA Editor -> Tools -> Tài liệu tham khảo -> Browse -> Chọn

này sẽ cho phép bạn để sau đó khai báo các lớp được tìm thấy trong thư viện của bạn.

Dim TestClass As Test 
Set TestClass = New Test 
MsgBox TestClass.HelloWorld 

HƯỚNG DẪN - nếu bạn muốn sử dụng dll trên máy khách khác, bạn sẽ phải sử dụng regasm.exe - để đăng ký lắp ráp trên máy đó.

Điều này có thể được thực hiện bằng dòng lệnh,

regasm.exe

trong trường hợp này

regasm.exe TestDll.dll

lần bạn đã đăng ký hội đồng trên máy khách mới, bạn sẽ có thể truy cập lại bằng cách thêm tham chiếu vào * .tlb

Hy vọng điều này sẽ hữu ích!

+0

Có, tôi nghĩ rằng bạn đã có được bảo hiểm độc đáo – AnthonyWJones

+0

Bạn có chạy regasm trên máy phát triển hoặc máy khách? Bởi vì máy khách của tôi không có cài đặt .NET. – Alexey

+0

Alexey .Net DLL sẽ cần khung .Net để chạy trên máy khách. – divinci

6

Chỉ muốn nhận xét rằng trong Visual Studio 2008, để lấy tệp .tlb được tạo, bạn cũng phải đi theo Ứng dụng | Assembly Information và chọn "Make Assembly COM visible". Đã cho tôi một thời gian để tìm thấy điều đó, vì vậy hy vọng nó sẽ giúp người khác ra ngoài.

+1

+1 cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! Làm việc rất liên tục trước đó, rồi dừng lại, bây giờ làm việc sau khi làm điều này, thần biết điều gì xảy ra tiếp theo, nhưng ít nhất nó đang làm việc cho bây giờ. Sử dụng VS2010 ở đây, vì vậy vẫn có liên quan. –

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