ทำไม Ubuntu จึงพยายามเปิดแอพ Mono ของฉันกับ Wine แทนที่จะเป็น Mono


5

ดังนั้นฉันได้รวบรวมโปรแกรม C # บน Linux โดยใช้ MonoDevelop เมื่อฉันพยายามที่จะเรียกใช้ไบนารี่ที่ได้ผลลัพธ์ระบบของฉันจะพยายามและล้มเหลวในการรันมันเป็นปฏิบัติการแบบวินโดวส์พร้อมกับไวน์ ไวน์ให้ข้อความต่อไปนี้แก่ฉัน:

$ ~/bin/MyMonoApp
wine: Install the Windows version of Mono to run .NET executables
~/bin/MyMonoApp: command not found

ฉันสามารถโน้มน้าวให้ทำงานโดยการโทรอย่างชัดเจนmono:

$ mono ~/bin/MyMonoApp

ดังนั้นฉันจะทำให้ค่านี้เป็นค่าเริ่มต้นได้อย่างไรฉันจึงไม่ต้องโทรหาโมโนอย่างชัดเจนทุกครั้งหรือไม่


พิมพ์: file MyMonoApp และบอกให้เราทราบผลลัพธ์
kmarsh

พัดลมระบายความร้อนของแล็ปท็อปของฉันเพิ่งตายดังนั้นฉันจึงไม่สามารถแก้ไขได้จนกว่าจะมีคนใหม่มาถึง
Ryan Thompson

MyMonoApp: PE32 สามารถใช้งานได้กับ MS Windows (คอนโซล) Intel 80386 ชุดประกอบโมโน / .Net 32 ​​บิต 32 บิต
Ryan Thompson

คำตอบ:


7

การดำเนินการไบนารีในเคอร์เนล Linux ถูกควบคุมผ่านbinfmt_miscโมดูล (ย่อมาจาก "รูปแบบไบนารีจิปาถะ") วิธีการทำงานของมันคือเคอร์เนลตรวจสอบสองสามไบต์แรกของไฟล์และดูว่ามี“ หมายเลขวิเศษ ” ที่กำหนดรูปแบบไฟล์ที่รู้จักหรือไม่ ความคิดคือว่าถ้าเคอร์เนลเห็นจำนวนความมหัศจรรย์ของปฏิบัติการ .NET มันเรียกmono; หากเห็นหมายเลขมายากลของ jar (ไบนารีเครื่องเสมือน Java) จะเรียก JRE; เป็นต้น

ปัญหาของ Mono และ Wine คือเลขเวทย์มนตร์นั้นเหมือนกัน -. NET executable เป็นแบบปฏิบัติการแบบ Windows หากทั้งสองรูปแบบมีการลงทะเบียนด้วยbinfmt_miscสิ่งที่ลงทะเบียนล่าสุดชนะ อุ่ย

บนระบบที่ได้รับ Debian หมายเลขเวทย์มนตร์สำหรับโปรแกรมปฏิบัติการ Windows ไม่ได้เรียกไวน์หรือโมโนโดยตรง: มันต้องผ่านสคริปต์ที่ดำเนินการทดสอบเพิ่มเติมเพื่อตัดสินใจว่าจะใช้สภาพแวดล้อมแบบใด สคริปต์เริ่มต้นที่เป็นปัญหาถูกเขียนขึ้นสำหรับ Debian มันอาจถูกใช้โดยดิสทริบิวชันอื่น ๆ (เช่น Ubuntu ได้เก็บไว้)

เห็นได้ชัดว่าการกระจายของคุณ (อันไหนที่คุณไม่พูด!) ไม่ได้ใช้ สิ่งแรกที่ต้องตรวจสอบคือหากมีการอัปเดตที่คุณยังไม่ได้ใช้มีบางสิ่งที่คล้ายกัน หากคุณต้องการพอร์ตกลไกนี่คือที่ที่จะหาบิต; มันเป็นงานเขียนโปรแกรมขนาดเล็ก สคริปต์อยู่/usr/share/binfmt-support/run-detectorsในแพ็คเกจ binfmt-support (คุณต้องการไลบรารี่/usr/share/perl5/Binfmtด้วย) สำหรับ mono ตัวตรวจจับอยู่/usr/lib/cli/binfmt-detector-cliในแพ็คเกจmono-commonหรือmono-runtime

หากการแจกจ่ายของคุณไม่มีการสนับสนุนเป็นพิเศษและคุณไม่สนใจเกี่ยวกับไบนารีของไวน์เส้นทางแบบแมนนวลมากขึ้นจะง่ายขึ้น binfmt_miscโมดูลจะถูกควบคุมผ่าน/proc/sys/fs/binfmt_miscไดเรกทอรี คุณสามารถลงทะเบียนรูปแบบโดยเขียนถึง/proc/sys/fs/binfmt_misc/register; แต่ละไฟล์ในไดเรกทอรีนี้นอกเหนือจากregisterและstatusแสดงถึงรูปแบบที่ลงทะเบียน ระวังเมื่อเขียนถึงregister: หากคุณบังเอิญลงทะเบียนหมายเลขเวทย์มนตร์ที่ตรงกับ Linux native executables (ELF) คุณมีโอกาสที่จะใช้ระบบของคุณโดยไม่มีวิธีการรักษาอื่นใดนอกจากการรีบูท หากต้องการยกเลิกการลงทะเบียนwineรูปแบบสะท้อนไป-1 โมดูลการบันทึกไว้ในในเอกสารลินุกซ์/proc/sys/fs/binfmt_misc/winebinfmt_miscDocumentation/binfmt_misc.txt.gz

ทางออกหนึ่งสำหรับปัญหาของคุณคือการยกเลิกการลงทะเบียนรูปแบบไวน์ คุณจะต้องทำอย่างนั้นหลังจากสคริปต์บูตใดที่ลงทะเบียนรูปแบบไบนารี วิธีการแก้ปัญหาทางเลือกคือการหาที่ในกระบวนการบูตรูปแบบไวน์ที่มีการลงทะเบียนและข้ามส่วนนี้ ทางออกที่สามคือการหาวิธีที่จะแยกความแตกต่าง executables .NET จากปฏิบัติการ Windows อื่น ๆ และลงทะเบียนหมายเลขมายากล NET. หลังจากหมายเลขมายากล Windows ทั่วไป


ฉันใช้ Ubuntu Lucid ฉันเดาว่าสคริปต์เดเบียนยังไม่ได้ทำ ฉันสามารถดาวน์โหลดแพ็คเกจ debian binfmt-support และสร้างมันบน Ubuntu ได้ไหม?
Ryan Thompson

@Ryan: Ubuntu lucid มีการรองรับเหมือนกันดังนั้นบางอย่างผิดปกติ ทำ/proc/sys/fs/binfmt_misc/cliและ/proc/sys/fs/binfmt_misc/wineทั้งสองแสดงinterpreter /usr/share/binfmt-support/run-detectors? หากคุณเรียกใช้/usr/lib/cli/binfmt-detector-cli ~/bin/MyMonoApp; echo $?จะมีการแสดง0หรือ1( 0หมายถึงว่าไฟล์ปฏิบัติการของคุณถูกระบุว่าเป็นโมโน) หรือไม่?
Gilles

มันแสดงให้เห็นเป็นศูนย์ แต่มันก็ยังต้องการที่จะวิ่งไปกับไวน์
Ryan Thompson

อืมมม /proc/sys/fs/binfmt_misc/cliไม่มี และแสดงให้เห็นว่า/proc/sys/fs/binfmt_misc/cli interpreter /usr/bin/wine
Ryan Thompson

@Ryan: /proc/sys/fs/binfmt_misc/cliควรมีอยู่หาก/usr/bin/monoมีให้บริการโดยแพ็คเกจเดียวกัน ไม่/var/lib/binfmts/cliอยู่? เป็นmonoคำสั่ง/usr/bin/monoจากmono-runtimeแพคเกจ? ด้านไวน์คุณหมายถึงการ…/wineแสดงinterpreter /usr/bin/wineหรือไม่? ไวน์นั้นมาจากอูบุนตูจักรวาลหรือจากแหล่งอื่นหรือไม่
Gilles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.