2012-07-03 32 views
6

Cố gắng tạo plugin C# NPAPI Tôi đã tìm thấy một số tutorial mô tả rằng dll của bạn cần triển khai một số phương pháp như NP_GetEntryPoints, NP_InitializeNPP_New cùng với một số phương pháp khác. Tuy nhiên những gì tôi muốn hiểu là nếu tôi chỉ đơn giản là có thể phản ánh các tên phương pháp và xây dựng datastructures tương đương như mô tả trong bài viết (như _NPPluginFuncs) trong C# và tất cả mọi thứ sẽ làm việc? #:Xây dựng plugin NPAPI trong C#

Có thể ai đó vui lòng cung cấp một số hướng dẫn? Có thể xây dựng một plugin NPAPI trong C# và nếu vậy các bước cơ bản có liên quan là gì?

+0

Có ai còn sống ngoài kia không? :-p –

+3

Tôi không thể cung cấp cho bạn một câu trả lời chi tiết về NPAPI cụ thể, nhưng nói chung, bằng cách sử dụng C# để tạo ra một DLL với chức năng xuất khẩu tương thích C là không thể. Bạn có thể 1) tạo ra một chế độ hỗn hợp C++ DLL, hoặc (likelier nếu bạn cảm thấy thoải mái hơn trong C# so với quản lý C++) 2) tạo một DLL bản địa nhỏ có chứa xuất khẩu của bạn, trong đó sử dụng COM interop để giao cho một hội đồng quản lý bằng văn bản trong C# và chứa phần lớn chức năng của bạn. – shambulator

+0

Bây giờ, về cơ bản đó là một câu trả lời. Tôi giả định rằng trong một trường hợp tồi tệ hơn, một số loại interop sẽ là có thể (mặc dù không biết đủ về C++ để giả định COM) nhưng tôi cũng đã tìm ra một con đường dễ dàng hơn cho interop giữa C++ và C# –

Trả lời

4

Như đã nêu trong tài liệu hướng dẫn:

Một plugin trình duyệt NPAPI là, lúc đó là cốt lõi, chỉ đơn giản là một DLL với một vài điểm mục cụ thể

Điều đó có nghĩa bạn cần phải xuất khẩu một số chức năng từ một dll thông thường, được thực hiện thường trong C/C++. Thật không may là không thể để lộ bất kỳ điểm vào từ một đồng bằng C# dll, but look at this answer, với một số nỗ lực nó xuất hiện để có thể lừa một số xuất khẩu của một số loại công cụ xây dựng bài.

Trong mọi trường hợp, chúng tôi không mong đợi chuyển quá nhiều cấu trúc dữ liệu phức tạp từ/đến giao diện plugin, nó sẽ là một cơn đau. Nếu bạn quan tâm đến việc nghiên cứu thêm, keywork để sử dụng là "đảo ngược P/Gọi", tương tự với P/Invoke trực tiếp đang gọi dll thông thường từ thế giới được quản lý.

Lý do C# dll không thể hiển thị trực tiếp "điểm nhập" là điểm nhập thực sự chỉ là một số địa chỉ bên trong dll poiting cho một số mã lắp ráp ngay lập tức thực thi. C# dll là loại khác nhau của con thú: họ chỉ là các tập tin có chứa IL được biên dịch "Just In Time" và thực sự biên dịch như vậy buộc phải AFAIK with some OS tricks. Đây là lý do đảo ngược P/Invoke không phải là starightforward cả.

+0

Đó thực sự là câu lệnh chính xác khiến tôi bối rối "Plugin trình duyệt NPAPI ở lõi của nó, chỉ đơn giản là một DLL với một vài điểm cụ thể" - Ý tưởng đầu tiên của tôi là 'Tuyệt vời, vì vậy tôi có thể viết điều này trong C#' thực sự nghĩ về cách các DLL thực thi 'các điểm vào' và luôn luôn giả định rằng 'các điểm vào' trong C++ và C# sẽ làm việc giống nhau. Nhìn lại một suy nghĩ ngớ ngẩn nhưng tôi chưa bao giờ viết một dòng C++ –

+0

@MaximGershkovich Tôi đã cập nhật câu trả lời –

+0

Cảm ơn bạn, tôi đánh giá cao việc làm rõ. –

4

Như Georg Fritzsche nói trong bình luận của ông:

plugin NPAPI cơ bản DLL với một vài yêu cầu C-xuất khẩu

và không có cách nào tích hợp chức năng xuất khẩu (trong C-xuất khẩu ý nghĩa) từ một hội đồng viết bằng C#.

Một số lựa chọn của bạn là:

  1. Một chế độ hỗn hợp C++ lắp ráp mà có thể xuất các chức năng trực tiếp. Điều này có thể có ý nghĩa đối với việc lưu trữ CLR trong quá trình lưu trữ của plugin của bạn.
  2. Một DLL bản địa nhỏ lưu trữ xuất, sau đó sử dụng COM interop để ủy quyền cho một hội đồng C# chứa chức năng plugin. Cách "chính thức" để thực hiện cái gọi là "đảo ngược p/gọi".
  3. An intriguing project xử lý sau quá trình lắp ráp hoàn toàn được quản lý của bạn, chuyển các phương thức tĩnh được đánh dấu bằng thuộc tính tùy chỉnh thành xuất khẩu hàm được đặt tên. (Tôi không có liên kết với dự án này), tôi tình cờ gặp nó sau khi tôi tự hỏi liệu có ai đã cải thiện cách làm việc của COM hay không.)
+0

Cảm ơn bạn, điều này trong đào sâu vào câu hỏi tôi đã thực sự yêu cầu nhưng không biết làm thế nào để thể hiện. –

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