Почему бы не инкапсулировать зависящие от платформы вещи в интерфейсе, а затем найти способ «правильной» реализации для текущей платформы. Тогда вызывающий код может использовать его беспечно, и вы можете постепенно заполнять биты для запуска на моно, как и когда вы хотите. Я бы по крайней мере надеялся , что если вы даже никогда не загрузите класс, содержащий биты P / Invoke, у вас все будет в порядке ...
EDIT:
Я не понимаю, почему этот подход не должен работать, хотя вам может даже не понадобиться фабрика. Вот что я бы сделал:
MainForm.cs:
PlatformServicesFacade.InitializeSystemMenu();
IPlatformServices.cs:
public interface IPlatformServices
{
void InitializeSystemMenu();
}
MonoPlatformServices.cs:
public class MonoPlatformServices : IPlatformServices
{
// Prevent early type initialization
static WindowsPlatformServices() {}
public void InitializeSystemMenu()
{
// Maybe log what you would have done?
}
}
WindowsPlatformServices.cs:
public class WindowsPlatformServices : IPlatformServices
{
// Prevent early type initialization
static WindowsPlatformServices() {}
public const Int32 SystemMenuAboutSWikiId = 1000;
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern bool InsertMenu(IntPtr hMenu, Int32 wPosition,
Int32 wFlags, Int32 wIDNewItem,
string lpNewItem);
public void InitializeSystemMenu()
{
const Int32 MF_SEPARATOR = 0x800;
const Int32 MF_BYPOSITION = 0x400;
IntPtr systemMenuPtr = GetSystemMenu(Handle, false);
InsertMenu(systemMenuPtr, 5, MF_BYPOSITION | MF_SEPARATOR, 0, "");
InsertMenu(systemMenuPtr, 6, MF_BYPOSITION, SystemMenuAboutSWikiId,
"About SWiki...");
}
}
PlatformServicesFacade.cs:
public class PlatformServicesFacade
{
private static readonly IPlatformServices services;
static PlatformServiceFacade()
{
services = RunningOnWindows() ? new WindowsPlatformServices()
: (IPlatformServices) new MonoPlatformServices();
}
public static void InitializeSystemMenu()
{
services.InitializeSystemMenu();
}
}
Я думаю , что должно работать ... если это не так, пожалуйста, сообщите нам, что идет не так:)