ນີ້ແມ່ນຄໍາສັ່ງ mono-shlib-cop ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
mono-shlib-cop - ຕົວກວດສອບການນຳໃຊ້ຫ້ອງສະໝຸດທີ່ແບ່ງປັນ
ສະຫຼຸບສັງລວມ
mono-shlib-cop [ຕົວເລືອກ]* [ASSEMBLY-FILE-NAME]*
OPTIONS
-p, --prefixes=PREFIX
ຄຳນຳໜ້າການຕິດຕັ້ງ Mono. ນີ້ແມ່ນເພື່ອຊອກຫາ $prefix/etc/mono/config. ຄ່າເລີ່ມຕົ້ນ
ແມ່ນອີງໃສ່ສະຖານທີ່ຂອງ mscorlib.dll, ແລະປົກກະຕິແມ່ນຖືກຕ້ອງ.
ລາຍລະອຽດ
mono-shlib-cop ເປັນເຄື່ອງມືທີ່ກວດກາການປະກອບການຄຸ້ມຄອງການຊອກຫາຄວາມຜິດພາດຫຼື
ການນໍາໃຊ້ທີ່ຫນ້າສົງໃສຂອງຫ້ອງສະຫມຸດແບ່ງປັນ.
ເຄື່ອງມືໃຊ້ເວລາຫນຶ່ງຫຼືຫຼາຍຊື່ໄຟລ໌ປະກອບ, ແລະກວດກາແຕ່ລະສະພາແຫ່ງທີ່ກໍານົດໄວ້.
ຂໍ້ຜິດພາດທີ່ກວດສອບລວມມີ:
* ມີຫ້ອງສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນບໍ?
* ສັນຍາລັກທີ່ຮ້ອງຂໍມີຢູ່ໃນຫ້ອງສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນບໍ?
ຄໍາເຕືອນທີ່ກວດສອບສໍາລັບການປະກອບມີ:
* ຫໍສະໝຸດທີ່ແບ່ງປັນເປົ້າໝາຍເປັນຫໍສະໝຸດສະບັບບໍ? (ກ່ຽວຂ້ອງພຽງແຕ່ຢູ່ໃນລະບົບ Unix,
ບໍ່ແມ່ນ Mac OS X ຫຼື Windows.)
ໂດຍທົ່ວໄປ, ມີພຽງແຕ່ຫ້ອງສະຫມຸດສະບັບເຊັ່ນ: libc.so.6 ມີຢູ່ໃນເຄື່ອງຂອງຜູ້ໃຊ້,
ແລະຄວາມພະຍາຍາມໃນການໂຫຼດ libc.so ຈະສົ່ງຜົນໃຫ້ a System.DllNotFoundException. ມີສາມ
ວິທີແກ້ໄຂນີ້:
1. ຮຽກຮ້ອງໃຫ້ຜູ້ໃຊ້ຕິດຕັ້ງໃດໆ -ການພັດທະນາ ແພກເກດທີ່ສະຫນອງ unversioned
ຫໍສະໝຸດ. ນີ້ປົກກະຕິແລ້ວຮຽກຮ້ອງໃຫ້ຜູ້ໃຊ້ຕິດຕັ້ງຈໍານວນຫລາຍຂອງການເພີ່ມເຕີມ
packages, complicating ຂະບວນການຕິດຕັ້ງ.
2. ໃຊ້ຊື່ສະບັບເຕັມຢູ່ໃນຂອງທ່ານ DllImport ຖະແຫຼງການ. ອັນນີ້ຕ້ອງການການແກ້ໄຂ
ລະຫັດແຫຼ່ງຂອງທ່ານແລະ recompiling ທຸກຄັ້ງທີ່ທ່ານຕ້ອງການເພື່ອເປົ້າຫມາຍສະບັບທີ່ແຕກຕ່າງກັນຂອງ
ຫ້ອງສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນ.
3. ສະໜອງ assembly.config ໄຟລ໌ທີ່ປະກອບດ້ວຍ ອົງປະກອບທີ່ຈະ remap ໄດ້
ຊື່ຫ້ອງສະໝຸດທີ່ແບ່ງປັນທີ່ໃຊ້ໂດຍການປະກອບຂອງທ່ານໃສ່ຫ້ອງສະໝຸດທີ່ແບ່ງປັນສະບັບຕົວຈິງ
ນໍາສະເຫນີຢູ່ໃນລະບົບຜູ້ໃຊ້. Mono ໃຫ້ຈໍານວນທີ່ມີຢູ່ແລ້ວກ່ອນ
ລາຍການ, ລວມທັງຫນຶ່ງສໍາລັບ libc.so ແລະ libX11.so.
EXAMPLE
ລະຫັດຕໍ່ໄປນີ້ປະກອບມີຕົວຢ່າງຂອງຄວາມຜິດພາດ ແລະຄໍາເຕືອນຂ້າງເທິງ:
ການນໍາໃຊ້ System.Runtime.InteropServices; // ສໍາລັບ DllImport
ຫ້ອງຮຽນສາທິດ {
[DllImport ("bad-library-name")]
private static extern void BadLibraryName ();
[DllImport ("libc.so")]
private static extern void BadSymbolName ();
[DllImport ("libcap.so")]
private static extern int cap_clear (IntPtr cap_p);
}
ຊື່ຫ້ອງສະໝຸດບໍ່ດີ
ສົມມຸດວ່າຫ້ອງສະຫມຸດ bad-library-name ບໍ່ມີຢູ່ໃນເຄື່ອງຂອງເຈົ້າ,
Demo.BadLibraryName ຈະສ້າງຄວາມຜິດພາດ, ຍ້ອນວ່າມັນຮຽກຮ້ອງໃຫ້ມີຫ້ອງສະຫມຸດແບ່ງປັນທີ່
ບໍ່ສາມາດໂຫຼດໄດ້. ນີ້ອາດຈະເປັນສິ່ງທີ່ບໍ່ສົນໃຈ; ເບິ່ງ ບັກ
ຊື່ສັນຍາລັກທີ່ບໍ່ດີ
Demo.BadSymbolName ຈະສ້າງຄວາມຜິດພາດ, ເປັນ libc.so (ປັບປຸງໃຫມ່ເປັນ libc.so.6 by
ໂມໂນ $prefix/etc/mono/config file) ບໍ່ມີຟັງຊັນ BadSymbolName
ການຂຶ້ນກັບຫ້ອງສະໝຸດແບບບໍ່ປ່ຽນແປງ
ສົມມຸດວ່າທ່ານມີໄຟລ໌ libcap.so , Demo.cap_clear ຈະສ້າງຄໍາເຕືອນ
ເນື່ອງຈາກວ່າ, ໃນຂະນະທີ່ libcap.so ສາມາດໂຫຼດໄດ້, libcap.so ອາດຈະບໍ່ມີຢູ່ໃນຜູ້ໃຊ້
ເຄື່ອງ (ໃນ FC2, /lib/libcap.so ແມ່ນສະຫນອງໂດຍ libcap-devel , ແລະທ່ານບໍ່ສາມາດສົມມຸດ
ຜູ້ໃຊ້ສຸດທ້າຍຈະມີອັນໃດ -ການພັດທະນາ ແພັກເກດທີ່ຕິດຕັ້ງ).
FIXING CODE
ການແກ້ໄຂແມ່ນຂຶ້ນກັບການເຕືອນໄພ ຫຼືຄວາມຜິດພາດ:
ຊື່ຫ້ອງສະໝຸດທີ່ບໍ່ດີ
ໃຊ້ຊື່ຫ້ອງສະໝຸດທີ່ຖືກຕ້ອງໃນ DllImport ຄຸນລັກສະນະ, ຫຼືສະຫນອງ a ເຂົ້າ
ເພື່ອສ້າງແຜນທີ່ຊື່ຫ້ອງສະໝຸດທີ່ມີຢູ່ຂອງທ່ານໃຫ້ເປັນຊື່ຫ້ອງສະໝຸດທີ່ຖືກຕ້ອງ.
ຊື່ສັນຍາລັກທີ່ບໍ່ດີ
ອ້າງເຖິງສັນຍາລັກທີ່ມີຕົວຈິງຢູ່ໃນຫ້ອງສະຫມຸດເປົ້າຫມາຍ.
ການຂຶ້ນກັບຫ້ອງສະໝຸດແບບບໍ່ປ່ຽນແປງ
ສະໜອງ ກ ເຂົ້າເພື່ອອ້າງອີງຫ້ອງສະໝຸດສະບັບທີ່ຖືກຕ້ອງ, ຫຼືບໍ່ສົນໃຈ
ເຕືອນໄພ (ເບິ່ງ ບັກ ).
DLLMAP ເຂົ້າມາ
Mono ຊອກຫາ ASSEMBLY-NAME ຂໍ້ມູນແຜນທີ່. ຕົວຢ່າງ, ກັບ mcs.exe , ໂມໂນ
ຈະອ່ານ mcs.exe.config , ແລະສໍາລັບ Mono.Posix.dll , Mono ຈະອ່ານ Mono.Posix.dll.config
ໄດ້ .config ໄຟລ໌ແມ່ນເອກະສານ XML ທີ່ມີລະດັບສູງສຸດ ພາກສ່ວນທີ່ມີ
ຮັງ ລາຍການ, ເຊິ່ງປະກອບດ້ວຍ dll ແລະ ເປົ້າຫມາຍ ຄຸນລັກສະນະ. ຄຸນສົມບັດ dll
ຄວນມີສະຕຣິງອັນດຽວກັນທີ່ໃຊ້ຢູ່ໃນຂອງເຈົ້າ DllImport ຄຸນຄ່າຄຸນສົມບັດ, ແລະເປົ້າຫມາຍ
ຄຸນລັກສະນະລະບຸວ່າ mono ຫ້ອງສະຫມຸດທີ່ແບ່ງປັນຄວນຈະ ຕົວຈິງແລ້ວ ໂຫຼດໃນເວລາແລ່ນ.
ຕົວຢ່າງໄຟລ໌ .config ແມ່ນ:
ໃຊ້ mono-shlib-cop ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net