2009-05-19 47 views
16

Tôi có đối tượng .NET 2.0 COM được VBA sử dụng trong Excel. Nó hoạt động tốt trên máy dev của tôi, nhưng khi cố gắng sử dụng nó trên một máy trạm VM sạch tôi nhận được lỗi này:Excel .NET COM - Lỗi tự động hóa. Hệ thống không thể tìm thấy tệp được chỉ định

Lỗi tự động hóa. Hệ thống không thể tìm thấy tệp được chỉ định.

dll được đăng ký với "regasm/tlb/codebase mycom.dll" và không được đặt trong GAC. Tôi không có quyền quản trị trên hộp VM

Bất kỳ ý tưởng nào?

Trả lời

13

Bạn cần phải gọi lệnh regasm với đường dẫn đầy đủ đến assembly như giá trị tham số codebase hoặc đặt assembly vào một số vị trí luôn nằm trên đường dẫn tìm kiếm thư viện. Nếu không, nó sẽ không được tìm thấy khi máy khách cố gắng khởi tạo đối tượng COM.

+0

Tôi đã thử sử dụng regasm trên đường dẫn đầy đủ của hội đồng nằm trong c: \ temp, nhưng vẫn cùng lỗi – ingt

+1

Sau đó, tôi đoán đặt cược tốt nhất của bạn là bắt đầu ProcessMonitor - http://technet.microsoft.com /ru-ru/sysinternals/bb896645.aspx - và xem chính xác tệp nào không tìm thấy. Nó có thể là một số hội đồng phụ thuộc mà bạn không hề biết. Một khi bạn biết chắc chắn nó sẽ dễ dàng hơn nhiều để giải quyết. – sharptooth

+1

sharptooth, cảm ơn bạn * rất * rất nhiều cho câu trả lời này. Nó đã cứu giấu tôi ngày hôm nay! –

7

Trên cửa sổ 7, 64 bit và .NET 4.0 framework dll (32 bit) mà tôi muốn có thể sử dụng làm đối tượng COM cho ứng dụng Microsoft Excel 2010 VBA, dưới đây là những gì phù hợp với tôi.

  1. Sao chép dll để c: (../TLB :.) \ windows \ SysWOW64
  2. Trong một vỏ cmd, chạy

    C:\Windows\Microsoft.NET\Framework\v4.0.<whatever you have>\regasm.exe c:\windows\syswow64\<name of dll> /codebase /tlb:c:\windows\syswow64\<name of dll minus '.dll'>.tlb 
    

Bạn có thể bỏ qua phần cuối cùng nếu bạn không muốn hoặc cần intellisense trên máy bạn đang đăng ký lắp ráp trên.

Khóa treo chính là trên XP, tôi chưa bao giờ phải sử dụng tham số/codebase trước đây, nhưng đó là điều quan trọng cần thiết trước khi hoạt động.

3

Tôi nhận được lỗi "Tự động hóa. Hệ thống không thể tìm thấy tệp đã chỉ định" sau khi tôi đã tạo .NET .dll (v4.0) với ý định sử dụng nó trong ứng dụng VB6 (trang trí lớp của tôi bằng " ClassInterface "và" ComVisible "thuộc tính, phương pháp với" ComVisible ").

Tôi chạy "regasm.exe -tlb C: \ PathTo \ MyDll.dll" nhưng đã nhận được lỗi ở trên sau khi thêm tệp .tlb làm tham chiếu trong ứng dụng VB6 của tôi và chạy/gỡ lỗi nó. Chỉ sau khi thêm tham số "-codebase" vào cuộc gọi regasm.exe và thêm lại tham chiếu .tlb thì lỗi đã được giải quyết.

Chỉ nghĩ rằng tôi muốn chia sẻ kinh nghiệm của mình.

0

Tôi cũng nhận được lỗi tự động hóa. Tài liệu tham khảo của tôi (trong MS Access) là một tập tin TLB. Tệp DLL tương ứng bị thiếu trong thư mục chứa tệp TLB và điều này làm cho thông báo 'lỗi tự động hóa' xuất hiện. Thêm DLL trở lại cố định.

0

Tôi đã nhận được cùng một lỗi (không thể tiêu thụ đối tượng .NET từ mã kế thừa VB6 trên máy tính thứ hai, sau khi nó hoạt động trên máy đầu tiên mà ban đầu tôi đã viết nó). Các.NET DLL biên dịch và đăng ký tốt - Tôi đã thử tất cả các loại kết hợp - có và không sử dụng "Đăng ký cho COM Interop" xây dựng thiết lập trong VS; đăng ký bằng tay thông qua regasm.exe và thử cả hai có và không có tham số/codebase; đã thử cả bật và tắt thuộc tính mức độ hiển thị COM có thể nhìn thấy (khi triệt tiêu, tôi đặt thuộc tính trên lớp mà tôi cần để tiêu thụ từ COM). Nhưng không có gì làm việc, tôi cứ bị lỗi như vậy.

Hóa ra tôi đã nâng cấp đầu ra DLL thành .NET 4.5 trên máy thứ hai, trong khi ban đầu nó được xây dựng một hội đồng .NET 2.0. Dự án của tôi đã có một vài tài liệu tham khảo nhắm mục tiêu bên thứ 3 Interop DLL đang chạy .NET 2.0. Khi tôi hoặc cập nhật các tài liệu tham khảo và xây dựng lại DLL -hoặc thiết lập dự án của tôi trở lại để chạy trên .NET 2.0 - vấn đề của tôi đã được giải quyết. Khi sử dụng/codebase (mà VS tự động) Tôi thấy rằng tôi không cần phải đặt DLL của tôi trong thư mục ứng dụng hoặc trong \ syswow64. Ngoài ra các tài liệu MSDN nhà nước bạn phải sử dụng một SN (tên mạnh) cho lắp ráp của bạn khi sử dụng/codebase, nhưng tôi thấy bạn không phải; bạn chỉ nhận được một cảnh báo từ công cụ dòng lệnh regasm.exe.

Điểm là, từ quan điểm COM Interop, hãy cẩn thận về phiên bản .NET runtime của các phụ thuộc của bạn đối với .NET Framework bạn đang nhắm mục tiêu.

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