2010-11-17 42 views
7

Tôi đã thành công có thể chạy mã Net của riêng tôi bằng cách làm theo các bước đăng ở đây Execute .NET 3.0 code from Office 2003Sử dụng thư viện Net tiêu chuẩn với VBA

Có cách nào để sử dụng các thư viện Net tiêu chuẩn mà không cần phải viết một wrapper ? Bằng cách này chúng ta có thể tránh phải đăng ký và cài đặt một DLL tùy chỉnh vào GAC trên máy của khách hàng.

Tôi đã tìm thấy tệp tlb đã có trong thư mục C: \ Windows \ Microsof.NET \ Framework và đã có thể thêm tham chiếu đến mscorlib.dll. Nhìn vào tài liệu cho RijndaelManaged, lớp này dường như được hiển thị COM.

Tôi có thể tạo một cá thể, nhưng ngay khi tôi thử và làm việc với nó, tôi gặp lỗi (ví dụ: "Loại không phù hợp").

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    Set key = aesImplementation.GenerateKey() 
    Set iv = aesImplementation.GenerateIV() 
End Sub 

Tôi sẵn sàng chấp nhận mọi bản hack bạn phải cung cấp!

+2

Tôi không có một câu trả lời lại: sử dụng. NET mà không có một wrapper, nhưng nếu bạn mới đến VBA, bạn cần phải biết rằng tuyên bố một cái gì đó 'Như mới' không thực sự instantiate bất cứ điều gì tại thời điểm đó giống như trong .NET. Nó không rõ ràng với tôi cho dù lỗi của bạn đang được nâng lên trên instantiation hoặc trên 'Set'. (Tôi giả sử bạn đã khai báo biến 'khóa' của bạn là loại chính xác, v.v.) Xem http://stackoverflow.com/questions/2478097/vba-difference-in-two-ways-of-declaring-a -new-object-trying-to-understand-why/2480559 # 2480559 – jtolle

+0

Đó là điều điên rồ Tại sao có As New as syntax hợp lệ nếu nó không khởi tạo một đối tượng mới ?! Nó dường như tạo ra một trường hợp trong trường hợp này mặc dù, tôi sẽ nhớ ít nhất là "As New" không phải là thực hành tốt nhất. Lý do tôi chưa khai báo đối tượng khóa một cách rõ ràng là vì tôi nhận được lỗi "Không thể gán cho mảng" nếu tôi làm. Rõ ràng lỗi này xảy ra khi bạn thử và gán cho một mảng của một kiểu khác. –

+1

Đây không phải là rất nhiều công việc để tiết kiệm chỉ một số công việc? Ý tôi là, nếu người dùng của bạn sẽ cho phép bạn chạy macro, tại sao không chạy một ứng dụng .NET thực tế? Văn phòng interop trong. NET có vẻ khá tốt, vì vậy bạn có thể thao tác tài liệu bằng nhau hoặc tốt hơn! –

Trả lời

1

Không thể thực hiện được. VBA (VB cho các ứng dụng) không phải là VB, mà là một giao dịch riêng biệt bắt chước tất cả cú pháp cơ bản như các phiên bản cũ của VB. Nó gần giống như sử dụng một phiên bản rất nhỏ gọn của VB cũ hơn. Trong thực tế, VBScript là trận đấu gần nhất với VBA. Có lẽ một ngày nào đó, Microsoft sẽ xây dựng trong các phương pháp để làm việc trực tiếp với GAC, nhưng cho đến lúc đó (và ngày đó có thể có nghĩa là cái chết của COM tôi chắc chắn), bạn đang mắc kẹt bằng cách sử dụng phương pháp COM CreateObject(), thêm một tham chiếu đến một COM thư viện đã đăng ký vào dự án Office của bạn hoặc trực tiếp tham chiếu tệp DLL hoặc TLB tương thích VBA/COM trong dự án Office của bạn.

Có một số thư viện COM kích hoạt mặc định trong GAC mặc định, nhưng đối với đa số, bạn đang gặp khó khăn khi tạo Trình bao bọc có thể gọi Com đầu tiên trong VB.Net hoặc C#.

Ngược lại, khá nhiều ứng dụng MS Office là COM có thể gọi, vì vậy bạn có thể làm việc với các ứng dụng Office đã cài đặt thông qua các dự án VB.Net mà bạn muốn.

+3

Bằng cách thêm tham chiếu đến 'mscorlib.dll', bạn có thể tạo một đối tượng của bất kỳ lớp nào có một hàm tạo công khai không tham số trong thư viện chuẩn .net. Bạn sẽ thấy điều này rất hạn chế. – AndASM

+1

"VBScript là trận đấu gần nhất với VBA" - VBA là * nhiều * gần gũi hơn với VB6 cổ điển hơn là VBScript: https://msdn.microsoft.com/en-us/library/ms970436.aspx – Joe

1

Bạn sẽ có thể sử dụng ComVisible lớp .NET theo cách này. Tuy nhiên, các phương thức GenerateKeyGenerateIV không có giá trị trả lại. Hãy thử:

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 

hoặc tốt hơn, không kém phần quan vì khi gỡ lỗi bạn có thể xem một lỗi xảy ra trong quá trình thi hoặc khi bạn gọi phương thức:

Sub Macro1() 
    Dim aesImplementation As RijndaelManaged 
    Set aesImplementation = New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 
Các vấn đề liên quan