2010-04-17 12 views
17

Trong dự án C#, chúng tôi thêm tham chiếu đến đối tượng COM thông qua thiết lập Thêm tham chiếu trỏ đến đối tượng COM, kết quả trong IDE tự động tạo ra lắp ráp interop. Vì vậy, điều này là tốt và tốt, nhưng chúng tôi đang xây dựng dựa trên .net 3.5 SP1 aka CLR 2.0, và interops tạo ra đang sử dụng 4.0 CLR làm cho chúng không tương thích. Có cách nào để ngăn chặn điều này?Visual Studio 2010, TlbImp tạo ra .net 4.0 interops trong 2.0 dự án

Tôi cho rằng tùy chọn khác là định cấu hình tập lệnh xây dựng của chúng tôi để thử sử dụng tlbimp.exe với tham số/tham chiếu? thế nào để trỏ đến mscorlib v2.0?

Nhưng dù sao, tôi hy vọng có một lá cờ ở đâu đó để cho phép điều này.

Trả lời

20

Tôi đã gặp chính xác vấn đề này. Giải pháp tôi tìm thấy là sử dụng phiên bản 3.5 của tlbimp từ .Net Framework SDK (hoặc Windows Platform SDK?) Nằm trong% ProgramFiles% \ Microsoft SDK \ Windows \ v6.0A \ bin đã sử dụng CLR 2.

I cũng thấy rằng tôi cần thông tin này để lấy thư viện kiểu đúng từ tệp exe tôi đã nhập, vì VS sẽ chỉ sử dụng thư viện kiểu đầu tiên:

"ID tài nguyên có thể được thêm vào tệp thư viện kiểu khi nhập gõ thư viện từ một mô-đun có chứa nhiều loại thư viện. "

Tlbimp MyModule.dll \ 1

từ http://msdn.microsoft.com/en-us/library/tt0cf3sx%28VS.80%29.aspx

2

tôi đã có vấn đề chính xác như nhau, nhưng ngay cả với v2.0 của Tlbimp.exe, tôi vẫn nhận được một dll 4.0, mà sẽ không hoạt động .
Tôi đã kết thúc bằng một giải pháp đơn giản hơn, trong trường hợp ai đó gặp phải vấn đề này:
Đăng ký dll bằng regsvr32 (hãy đảm bảo rằng bạn chạy với tư cách quản trị viên hoặc bạn sẽ gặp lỗi) khi thêm tham chiếu vào dự án, bạn sẽ tìm thấy dll của bạn trong tab COM.
Làm việc như một sự quyến rũ!

Trừ khi bạn muốn tạo dll interop để gửi nó với ứng dụng của bạn, sau đó bạn sẽ cần phải tìm ra con đường tlbimp.exe.

14

Giải pháp cho vấn đề là định cấu hình tlbimp.exe để chạy trong phiên bản 2.0 .NET runtime.

  1. Đi tới C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin và mở tệp tlbimp.exe.config.
  2. Thêm các dòng sau vào tập tin trong phần cấu hình:

    <startup> 
        <supportedRuntime version="v2.0.50727"/> 
    </startup> 
    
  3. Lưu tập tin, sau đó chạy Tlbimp.exe thực thi như bình thường.

+2

đã lưu ngày của tôi !!! Cảm ơn! – EdsonF

+0

Điều này không hoạt động với phiên bản Windows 10 của SDK/tlbimp, fwiw. Nó cung cấp lỗi về cấu hình song song không hợp lệ. Nếu không, câu trả lời hay! –

5

Nếu bạn đang sử dụng Xây dựng sự kiện, hãy thử này:

"$(SDK35ToolsPath)tlbimp" tlbimp arguments 

$ (SDK35ToolsPath) điểm đến C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin

Và nếu bạn muốn tham chiếu 4.0, $ (SDK40ToolsPath) là macro trỏ tới C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v7.0A \ Bin \ NETFX 4.0 Công cụ.

Trong dòng lệnh VS 2010, "nơi tlbimp" sẽ hiển thị tlbimp.exe trong thư mục Công cụ NETFX 4.0 trước tiên. Vì vậy, chúng tôi cần $ (SDK35ToolsPath) cho 3,5 tlbimp.exe.

0

Chỉ cần chạy

C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe 

Để tạo một thư viện interops Net phiên bản 2.0

1

Đối với tôi (Visual Studio 2013) nó chỉ là vấn đề của việc sử dụng quyền Tlbimp thực thi.

Tìm hiểu các bạn đang sử dụng theo mặc định:

where tlbimp

nào đối với tôi là

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\TlbImp.exe

Thay vì sử dụng một từ một phiên bản thấp hơn, ví dụ

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\tlbimp

đã sản xuất một bộ kết nối .Net 2 cho tôi, không cần chỉnh sửa tệp cấu hình. Bạn có thể sử dụng CorFlags trên exe để xác định phiên bản .Net mà nó sử dụng. Hoặc bạn chỉ có thể sử dụng Corflags trên đầu ra của bạn.