Inject method vào class

Chào mọi người ạ!

Năm ngoái, e có đăng 1 topic hỏi đáp: Ghép phần mềm dịch vào một phần mềm khác để chuyển ngôn ngữ phần mềm đó sang tiếng việt nhưng có vẻ diễn đạt không đúng lắm nên không đạt được câu trả lời mong muốn, may mắn là gần đây vọc vạch làm sao mà thêm được bộ dịch Quick Translator vào 1 game trung quốc thành công (tức là vào game thay vì hiện chữ trung thì hiện chữ Việt, tuy câu chữ hơi khó hiểu nhưng hơn không hiểu gì)
Do game hay update nên mỗi lần thế lại phải chỉnh file Assembly-CSharp.dll, mà game lại có tính năng mod, cũng như việc chỉnh file Assembly-CSharp.dll chỉ là xóa và thêm một vài dòng code nên
Em xin hỏi liệu có khả thi không khi xóa, thay đổi một vài dòng lệnh trong Assembly-CSharp.dll thông qua 1 file .dll khác (mod game) và nếu có thực hiện ntn ạ
Ví dụ e muốn xóa những dòng dưới

if (TFMgr.Instance.Language != "cn")
{
	this.UIInfo.m_L.m_title.restrict = "[\\S]";
	this.UIInfo.m_L.m_title.maxLength = 10;
	this.UIInfo.m_F.m_title.restrict = "[\\S]";
 	this.UIInfo.m_F.m_title.maxLength = 10;
}
else
{
	this.UIInfo.m_L.m_title.restrict = "[一-龥]";
	this.UIInfo.m_L.m_title.maxLength = 3;
	this.UIInfo.m_F.m_title.restrict = "[一-龥]";
	this.UIInfo.m_F.m_title.maxLength = 3;
}

hay e muốn thay những dòng này

this.inputTextField.promptText = value;

thành

this.inputTextField.promptText = TranslatorEngine.Dich(value, true);

nhưng thay vì vào Assembly-CSharp.dll và Assembly-CSharp-firstpass.dll xóa hay chỉnh trực tiếp thì e tạo ra 1 file .dll giúp thay đổi có được không ạ

À đây là game Amazing Cultivation Simulator và folder chứa các files dll của nó ạ: https://drive.google.com/file/d/15EHPacu3_cIMPXFbdoZQS0f-vd3CkCfm/view?usp=sharing

Rất mong nhận được sự giúp đỡ của mọi người, cám ơn và chúc mọi người sức khỏe ạ

Cách làm là bạn so sánh file cũ với file mới, xem là nó update những chỗ nào, sau đó chỉ việc tìm và sửa những chỗ khác nhau thôi.
Công cụ thì khá nhiều, mình vừa google thì thấy thằng WinMerge. Nếu không dùng được bạn tự google tiếp nhé, từ khóa: compare 2 dll files, diff 2 dll files tool

2 Likes

Việc tìm và sửa những chỗ nào thì mình/em đã biết rồi, ý của mình/em là có thể tạo 1 file .dll khác (như một mod của game) gián tiếp thay đổi việc xóa, sửa trên file Assembly-CSharp.dll chứ không dụng trực tiếp đến nó không?
Tuy nhiên cám ơn bạn/anh đã trả lời ạ

Mỗi lần cập nhật thì dữ liệu bản mod (các đoạn mã) sẽ đưa về mặc định hay sao mà phải sửa nhiều vậy?
Mình chưa hiểu gì hết.

3 Likes

Có khả năng sửa được, nhưng mình cần biết rõ yêu cầu của bạn trước thì mới tư vấn được.
Như ở trên mình hướng dẫn bạn cách update nhanh nhất, chứ k phải ý nói bạn k biết sửa.

Về yêu cầu thì nói 1 cách trâu bò thì có thể làm tương tự như cái game bạn đang sửa. Game nó load file lên, đọc file, hiển thị. Thì bạn làm giống thế, load file lên, đọc file và sửa.
Tốt nhất là bạn cứ đưa yêu cầu cụ thể lên thì sẽ dễ đưa giải pháp hơn.

4 Likes

Hm, tớ thấy cậu có source code rồi, sao cậu không thử sửa/xóa theo ý của cậu và rebuild lại file dll đó? :smile: Đó nên là cách đơn giản và hiệu quả nhất.
Ngoài ra, tớ không nghĩ cậu có cách nào đâu. Cậu không thể override các method getter setter (nó không phải virtual method), cũng không thể sửa 1 file text chứa toàn bộ các xâu (do code của cậu toàn hard code tất cả các xâu đó).

5 Likes

Để e trình bày rõ hơn ạ
Để chèn bộ dịch quick translator vào game e cần làm các bước: xoá một vài dòng code trong Assembly-CSharp.dll, thêm vài class trong file UI.Engine.dll và thay đổi vài dòng code trong Assembly-CSharp-firstpass.dll ạ
Việc này e có thể sửa trực tiếp bằng dnspy, tuy nhiên mỗi khi game update (ngày up 1 lần) thì phải làm lại các bước trên.
Nên e xin hỏi không biết có thể tạo file .dll riêng chứa các lệnh xoá, thêm hay sửa đổi code ở cả 3 file .dll gốc trên không ạ (tức là mỗi lần game update chỉ cần paste cái file .dll mới tạo vào mà không cần xoá, thêm, thay đổi code lại)

1 Like

Vâng ạ, do để share cho bạn bè nên e cố làm sao cho đơn giản nhất nhưng nếu không khả thì thì đành vậy.
Cám ơn a nhiều

1 Like

Làm theo hướng ghi qua class/overwrite public method các kiểu thì chắc là không được hoặc quá thủ công.

Có thể làm theo hướng patch file. Như bạn có đề cập, sẽ xóa 1 vài đoạn code, thì chỉ cần viết chương trình để search and replace đoạn code mà bạn muốn xóa, mỗi lần có bản update bạn chạy chương trình là ok.
Search and replace có thể là thay thế text đơn thuần như Ctrl F, cũng có thể sử dụng để search trong binary và thay thế hex/opcode. Đây là cách mà các bản patch làm việc. Nhưng ý tưởng vẫn là search and replace

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?