2012-10-09 30 views
9

Tôi đang cố gắng sử dụng một DLL được tạo bởi ikvmc từ một tệp jar được biên dịch từ mã Scala (vâng ngày của tôi là tuyệt vời). Trình biên dịch Scala dường như tạo ra các định danh chứa các ký hiệu đô la cho các toán tử quá tải, và IKVM sử dụng các định danh trong DLL được sinh ra (tôi có thể thấy nó trong Trình phản xạ). Vấn đề là, dấu hiệu đồng đô la là bất hợp pháp trong mã C#, và vì vậy tôi không thể tham khảo các phương pháp đó.Làm cách nào để tham khảo số nhận dạng có ký hiệu đô la từ C#?

Bất kỳ cách nào để khắc phục sự cố này?

+2

Bạn đang có một ngày vui vẻ, không phải là bạn? –

+1

Câu trả lời flippant sẽ là "viết lại DLL". –

+0

@AndrewCooper Tôi chắc chắn bằng cách sử dụng Mono.Cecil bạn có thể viết lại những phần của hội đồng. – DaveShaw

Trả lời

6

Bạn sẽ có thể truy cập các phương thức sôi nổi bằng cách sử dụng phản chiếu. Không phải là một giải pháp tốt đẹp, nhưng ít nhất nó nên hoạt động. Tùy thuộc vào cấu trúc của API trong DLL, có thể tạo ra một trình bao bọc xung quanh các phương thức để bản địa hóa mã phản chiếu. Sau đó, từ phần còn lại của mã của bạn chỉ cần gọi wrapper tốt đẹp.

Cách thay thế sẽ là hack vào IL trong DLL mục tiêu và thay đổi số nhận dạng. Hoặc thực hiện một số phần mềm hỗ trợ sau khi xây dựng trên mã của riêng bạn.

1

Viết từ đồng nghĩa cho những phương pháp:

def +(a:A,b:A) = a + b 
val plus = + _ 
+1

Sẽ hoạt động, nhưng tôi chủ yếu quan tâm đến các phương pháp được trưng bày bởi các lớp sưu tập. Tôi không muốn thay đổi tất cả các mã để sử dụng một phiên bản đặc biệt của những người. Có lẽ tôi sẽ kết thúc việc tạo trình bao bọc trong một lớp Scala đặc biệt mà sau đó tôi sẽ sử dụng từ C#. – Martin

0

Tôi lo sợ rằng bạn sẽ phải sử dụng Reflection để truy cập vào các thành viên. Thoát chỉ đơn giản là không làm việc trong trường hợp của bạn.


Nhưng đối với bạn, những người quan tâm đến cơ chế thoát tôi đã viết giải thích.

Trong C# bạn có thể sử dụng @ -ign để thoát khỏi từ khóa và sử dụng chúng làm số nhận dạng. Tuy nhiên, điều này không giúp đỡ để thoát khỏi nhân vật không hợp lệ:

bool @bool = false; 

Có một cách để viết định danh khác nhau bằng cách sử dụng một dãy thoát Unicode:

int i\u0064; // '\u0064' == 'd' 
id = 5; 

Có công trình này. Tuy nhiên, ngay cả với thủ thuật này bạn vẫn có thể không sử dụng $ -sign trong một định danh. Đang thử ...

int i\u0024; // '\u0024' == '$' 

... cung cấp cho lỗi trình biên dịch "Unexpected character '\u0024'". Mã định danh vẫn phải là số nhận dạng hợp lệ! Trình biên dịch C# có thể giải quyết trình tự thoát trong một loại xử lý trước và xử lý định danh kết quả như thể nó đã được nhập bình thường

Vì vậy, điều này thoát tốt cho điều gì? Có lẽ nó có thể giúp bạn, nếu ai đó sử dụng một nhân vật ngoại ngữ mà không phải là trên bàn phím của bạn.

int \u00E4; // German a-Umlaut 
ä = 5; 

+1

Làm thế nào để nó trả lời trên * Bất kỳ cách nào để giải quyết vấn đề này? *? –

+0

@ om-nom-nom: Không. Tôi muốn khám phá những khả năng thoát và cho thấy rằng họ không thể giải quyết vấn đề. Đã thêm câu lệnh cuối cùng vào câu trả lời của tôi. –

+0

Để các downvoters. Tôi biết rằng điều này không giải quyết được vấn đề. Tôi chỉ muốn giải thích rằng ngay cả những cơ chế thoát hiểm kỳ lạ cũng sẽ không giúp được gì. Có điều gì sai trong việc khám phá các cách tiếp cận khác nhau không? –

4

Có lẽ bạn có thể dạy IKVM để đổi tên các mã nhận dạng đó mà họ không có ký hiệu đô la? Tôi không siêu familar, nhưng một tìm kiếm nhanh chỉ cho tôi vào những:

http://weblog.ikvm.net/default.aspx?date=2005-05-02

What is the format of the Remap XML file for IKVM?

String and complex data types in Map.xml for IKVM!

Tốt Săn

+0

Ah! Rất thú vị thực sự! Có thể giải quyết vấn đề của tôi, tôi sẽ có một cái nhìn. – Martin

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