Mono Migration Analyzer (Moma) 是一个用于开发者使用的MS .net下开发的应用程序迁移到Mono平台的不兼容性检测工具。工具通过分析.dll或者.exe程序集的代码是否符合ECMA CLI,大家都知道符合ECMA CLI标准的.net 程序可以运行于MS .net和Mono平台。这个工具使用Cecil,这是一个用于检测代码是否符合ECMA CLI标准的类库,Mono网站上的小工具还真多。到http://www.mono-project.com/MoMA下载最新版本,解压后运行MoMA.exe,选择一个要分析的程序集,可以选择一组程序集一起分析,在程序集分析过程中,这个工具会分析程序集中的所有方法、属性,事件引用的所有方法,报告方法存在的问题,使用很简单。
Step 1
Step 2
Step 3
Step 4
我用它分析了一下Castle的程序集,发现他还是很多问题。看来迁移到Mono不是一件容易的事情。分析结果附后,有兴趣的你可以自己分析自己的程序集看看。
Scan time: 2006-11-30 21:27:32
For descriptions of issues and what to do, see http://www.mono-project.com/MoMA_-_Issue_Descriptions.
Calling Method | P/Invoke Method | External DLL |
Class Bamboo.Prevalence.Implementation.CommandLogWriter: | ||
void Win32HardFlush(FileStream) | int FlushFileBuffers(IntPtr) | KERNEL32.DLL |
Calling Method | Mono method that throws NotImplementedException | |
Class Bamboo.Prevalence.Implementation.CommandLogWriter: | ||
void Win32HardFlush(FileStream) | int Marshal.GetHRForLastWin32Error() |
Calling Method | Method with [MonoTodo] | Reason |
Class Bamboo.Prevalence.Implementation.CommandLogWriter: | ||
void Win32HardFlush(FileStream) | int Marshal.GetHRForLastWin32Error() | Not Specified |
Calling Method | Method with [MonoTodo] | Reason |
Class Boo.Lang.Compiler.Steps.EmitAssembly: | ||
void OnExponentiation(BinaryExpression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
bool EmitToBoolIfNeeded(Expression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
bool EmitToBoolIfNeeded(Expression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void InvokeRegularMethod(IMethod, MethodInfo, MethodInvocationExpression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void InvokeSuperMethod(IMethod, MethodInvocationExpression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void EmitGetTypeFromHandle(Type) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void OnHashLiteralExpression(HashLiteralExpression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void EmitNormalizedArrayIndex(Expression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void OnExpressionInterpolationExpression(ExpressionInterpolationExpression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void OnExpressionInterpolationExpression(ExpressionInterpolationExpression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void OnExpressionInterpolationExpression(ExpressionInterpolationExpression) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void SetProperty(Node, IProperty, Expression, Expression, bool) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void EmitCastIfNeeded(IType, IType) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void EmitCastIfNeeded(IType, IType) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
void EmitUnbox(IType) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Calling Method | Method with [MonoTodo] | Reason |
Class Boo.Lang.Runtime.RuntimeServices: | ||
MethodInfo EmitConversionProxy(Type, Type, MethodInfo) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Class Boo.Lang.Builtins: | ||
string shellm(string, String[]) | AppDomain AppDomain.CreateDomain(string, Evidence, AppDomainSetup) | Currently it does not allow the setup in the other domain |
Calling Method | Mono method that throws NotImplementedException | |
Class Boo.Microsoft.Build.Tasks.Booc: | ||
string GenerateFullPathToTool() | string ToolLocationHelper.GetPathToDotNetFrameworkFile(string, TargetDotNetFrameworkVersion) | |
string GenerateFullPathToTool() | string ToolLocationHelper.GetDotNetFrameworkVersionFolderPrefix(TargetDotNetFrameworkVersion) |
Calling Method | Method with [MonoTodo] | Reason |
Class Boo.Microsoft.Build.Tasks.Booc: | ||
string GenerateFullPathToTool() | string ToolLocationHelper.GetPathToDotNetFrameworkFile(string, TargetDotNetFrameworkVersion) | Not Specified |
string GenerateFullPathToTool() | string ToolLocationHelper.GetDotNetFrameworkVersionFolderPrefix(TargetDotNetFrameworkVersion) | Not Specified |
Calling Method | Mono method that throws NotImplementedException | |
Class Cassini.Connection: | ||
string get_LocalIP() | EndPoint Socket.get_LocalEndPoint() | |
string get_RemoteIP() | EndPoint Socket.get_RemoteEndPoint() |
Calling Method | Method with [MonoTodo] | Reason |
Class Cassini.Server: | ||
string GetInstallPathAndConfigureAspNetIfNeeded() | RegistryKey RegistryKey.CreateSubKey(string) | RegistryPermission |
string GetInstallPathAndConfigureAspNetIfNeeded() | RegistryKey RegistryKey.CreateSubKey(string) | RegistryPermission |
Calling Method | Mono method that throws NotImplementedException | |
Class IBatisNet.Common.Transaction.TransactionScope: | ||
bool get_IsInTransaction() | bool ContextUtil.get_IsInTransaction() | |
void EnterTransactionContext() | void ServiceConfig..ctor() | |
void EnterTransactionContext() | void ServiceConfig.set_TrackingEnabled(bool) | |
void EnterTransactionContext() | void ServiceConfig.set_TrackingAppName(string) | |
void EnterTransactionContext() | void ServiceConfig.set_TrackingComponentName(string) | |
void EnterTransactionContext() | void ServiceConfig.set_TransactionDescription(string) | |
void EnterTransactionContext() | void ServiceConfig.set_Transaction(TransactionOption) | |
void EnterTransactionContext() | void ServiceConfig.set_TransactionTimeout(int) | |
void EnterTransactionContext() | void ServiceConfig.set_IsolationLevel(TransactionIsolationLevel) | |
void EnterTransactionContext() | void ServiceDomain.Enter(ServiceConfig) | |
void EnterTransactionContext() | Guid ContextUtil.get_ContextId() | |
void Close() | bool ContextUtil.get_IsInTransaction() | |
void Close() | void ContextUtil.EnableCommit() | |
void Close() | void ContextUtil.DisableCommit() | |
void Close() | TransactionStatus ServiceDomain.Leave() |
Calling Method | Method with [MonoTodo] | Reason |
Class IBatisNet.Common.Utilities.Objects.Members.DelegatePropertySetAccessor: | ||
void .ctor(Type, string) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Class IBatisNet.Common.Utilities.Objects.Members.EmitPropertyGetAccessor: | ||
void EmitType(ModuleBuilder) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Class IBatisNet.Common.Utilities.Objects.Members.DelegatePropertyGetAccessor: | ||
void .ctor(Type, string) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Class IBatisNet.Common.Utilities.Objects.Members.EmitPropertySetAccessor: | ||
void EmitType(ModuleBuilder) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Class IBatisNet.Common.Transaction.TransactionScope: | ||
bool get_IsInTransaction() | bool ContextUtil.get_IsInTransaction() | Not Specified |
void EnterTransactionContext() | void ServiceConfig..ctor() | Not Specified |
void EnterTransactionContext() | void ServiceDomain.Enter(ServiceConfig) | Not Specified |
void EnterTransactionContext() | Guid ContextUtil.get_ContextId() | Not Specified |
void Close() | bool ContextUtil.get_IsInTransaction() | Not Specified |
void Close() | void ContextUtil.EnableCommit() | Not Specified |
void Close() | void ContextUtil.DisableCommit() | Not Specified |
void Close() | TransactionStatus ServiceDomain.Leave() | Not Specified |
Calling Method | P/Invoke Method | External DLL |
Class log4net.Appender.ColoredConsoleAppender: | ||
void Append(LoggingEvent) | IntPtr GetStdHandle(uint) | Kernel32.dll |
void Append(LoggingEvent) | IntPtr GetStdHandle(uint) | Kernel32.dll |
void Append(LoggingEvent) | bool GetConsoleScreenBufferInfo(IntPtr, ColoredConsoleAppender/CONSOLE_SCREEN_BUFFER_INFO&) | Kernel32.dll |
void Append(LoggingEvent) | bool SetConsoleTextAttribute(IntPtr, UInt16) | Kernel32.dll |
void Append(LoggingEvent) | bool SetConsoleTextAttribute(IntPtr, UInt16) | Kernel32.dll |
void ActivateOptions() | int GetConsoleOutputCP() | Kernel32.dll |
Class log4net.Appender.LocalSyslogAppender: | ||
void ActivateOptions() | void openlog(IntPtr, int, LocalSyslogAppender/SyslogFacility) | libc |
void Append(LoggingEvent) | void syslog(int, string) | libc |
void OnClose() | void closelog() | libc |
Class log4net.Appender.NetSendAppender: | ||
void Append(LoggingEvent) | int NetMessageBufferSend(string, string, string, string, int) | netapi32.dll |
Class log4net.Appender.OutputDebugStringAppender: | ||
void Append(LoggingEvent) | void OutputDebugString(string) | Kernel32.dll |
Class log4net.Util.NativeError: | ||
string GetErrorMessage(int) | int FormatMessage(int, IntPtr&, int, int, String&, int, IntPtr) | Kernel32.dll |
Class log4net.Util.WindowsSecurityContext: | ||
WindowsIdentity LogonUser(string, string, string) | bool LogonUser(string, string, string, int, int, IntPtr&) | advapi32.dll |
WindowsIdentity LogonUser(string, string, string) | bool DuplicateToken(IntPtr, int, IntPtr&) | advapi32.dll |
WindowsIdentity LogonUser(string, string, string) | bool CloseHandle(IntPtr) | kernel32.dll |
WindowsIdentity LogonUser(string, string, string) | bool CloseHandle(IntPtr) | kernel32.dll |
WindowsIdentity LogonUser(string, string, string) | bool CloseHandle(IntPtr) | kernel32.dll |
Calling Method | Mono method that throws NotImplementedException | |
Class log4net.Appender.TelnetAppender/SocketHandler: | ||
void OnConnect(IAsyncResult) | EndPoint Socket.get_RemoteEndPoint() | |
Class log4net.Config.XmlConfigurator: | ||
void Configure(ILoggerRepository, Uri) | void WebRequest.set_Credentials(ICredentials) | |
void Configure(ILoggerRepository, Uri) | WebResponse WebRequest.GetResponse() |
Calling Method | Method with [MonoTodo] | Reason |
Class log4net.Appender.EventLogAppender: | ||
void ActivateOptions() | string EventLog.LogNameFromSourceName(string, string) | Support remote machine |
void ActivateOptions() | void EventLog.DeleteEventSource(string, string) | Support remote machine |
void ActivateOptions() | string EventLog.LogNameFromSourceName(string, string) | Support remote machine |
void ActivateOptions() | string EventLog.LogNameFromSourceName(string, string) | Support remote machine |
Calling Method | P/Invoke Method | External DLL |
Class Netron.GraphLib.UI.GraphControl: | ||
void SaveImage(string) | bool BitBlt(IntPtr, int, int, int, int, IntPtr, int, int, int) | gdi32.dll |
Calling Method | Mono method that throws NotImplementedException | |
Class Netron.GraphLib.UI.GraphControlDesigner: | ||
void Initialize(IComponent) | void ControlDesigner.Initialize(IComponent) | |
void OnPaintAdornments(PaintEventArgs) | void ControlDesigner.OnPaintAdornments(PaintEventArgs) | |
void .ctor() | void ControlDesigner..ctor() | |
Class Netron.GraphLib.PropertyBag: | ||
Object System.ComponentModel.ICustomTypeDescriptor.GetEditor(Type) | Object TypeDescriptor.GetEditor(Object, Type, bool) |
Calling Method | Method with [MonoTodo] | Reason |
Class Netron.GraphLib.UI.GraphControlDesigner: | ||
void Initialize(IComponent) | void ControlDesigner.Initialize(IComponent) | Not Specified |
void OnPaintAdornments(PaintEventArgs) | void ControlDesigner.OnPaintAdornments(PaintEventArgs) | Not Specified |
void .ctor() | void ControlDesigner..ctor() | Not Specified |
Class Netron.GraphLib.PropertyBag: | ||
Object System.ComponentModel.ICustomTypeDescriptor.GetEditor(Type) | Object TypeDescriptor.GetEditor(Object, Type, bool) | Not Specified |
Calling Method | Mono method that throws NotImplementedException | |
Class NHibernate.Bytecode.CodeDom.BytecodeProviderImpl/Generator: | ||
IReflectionOptimizer Build(string) | CompilerResults CodeDomProvider.CompileAssemblyFromSource(CompilerParameters, String[]) |
Calling Method | Method with [MonoTodo] | Reason |
Class NHibernate.Property.BasicSetter: | ||
void Emit(ILGenerator) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Class NHibernate.Bytecode.EmitUtil: | ||
void EmitCreateDelegateInstance(ILGenerator, Type, MethodInfo) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Class NHibernate.Property.BasicGetter: | ||
void Emit(ILGenerator) | void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) | vararg methods are not supported |
Calling Method | Method not yet in Mono | |
Class NLog.Internal.FileAppenders.BaseFileAppender: | ||
FileStream WindowsCreateFile(string, bool) | void FileStream..ctor(SafeFileHandle, FileAccess, int) | |
Class NLog.Win32.Targets.PerfCounterTarget: | ||
void InitializePerfCounter() | PerformanceCounterCategory PerformanceCounterCategory.Create(string, string, PerformanceCounterCategoryType, CounterCreationDataCollection) |
Calling Method | P/Invoke Method | External DLL |
Class NLog.Internal.FileAppenders.BaseFileAppender: | ||
FileStream WindowsCreateFile(string, bool) | IntPtr CreateFile(string, Win32FileHelper/FileAccess, int, IntPtr, Win32FileHelper/CreationDisposition, Win32FileAttributes, IntPtr) | kernel32.dll |
Class NLog.Internal.Win32FileInfoHelper: | ||
bool GetFileInfo(string, IntPtr, DateTime&, Int64&) | bool GetFileInformationByHandle(IntPtr, Win32FileHelper/BY_HANDLE_FILE_INFORMATION&) | kernel32.dll |
Class NLog.Internal.Win32ThreadIDHelper: | ||
int get_CurrentUnmanagedThreadID() | int GetCurrentThreadId() | kernel32.dll |
void .ctor() | int GetCurrentProcessId() | kernel32.dll |
void .ctor() | uint GetModuleFileName(IntPtr, StringBuilder, int) | kernel32.dll |
Class NLog.LayoutRenderers.QpcLayoutRenderer: | ||
void Append(StringBuilder, LogEventInfo) | bool QueryPerformanceCounter(UInt64&) | kernel32.dll |
void Append(StringBuilder, LogEventInfo) | bool QueryPerformanceFrequency(UInt64&) | kernel32.dll |
Class NLog.Win32.Targets.ColoredConsoleTarget: | ||
void Write(LogEventInfo) | IntPtr GetStdHandle(int) | kernel32.dll |
void Write(LogEventInfo) | bool GetConsoleScreenBufferInfo(IntPtr, ConsoleWin32Api/CONSOLE_SCREEN_BUFFER_INFO&) | kernel32.dll |
void Write(LogEventInfo) | bool GetConsoleScreenBufferInfo(IntPtr, ConsoleWin32Api/CONSOLE_SCREEN_BUFFER_INFO&) | kernel32.dll |
void Write(LogEventInfo) | bool SetConsoleTextAttribute(IntPtr, UInt16) | kernel32.dll |
void Write(LogEventInfo) | bool FillConsoleOutputAttribute(IntPtr, UInt16, int, ConsoleWin32Api/COORD, UInt32&) | kernel32.dll |
void Write(LogEventInfo) | bool SetConsoleTextAttribute(IntPtr, UInt16) | kernel32.dll |
void ColorizeEscapeSequences(TextWriter, IntPtr, string, UInt16, UInt16) | bool SetConsoleTextAttribute(IntPtr, UInt16) | kernel32.dll |
void ColorizeEscapeSequences(TextWriter, IntPtr, string, UInt16, UInt16) | bool SetConsoleTextAttribute(IntPtr, UInt16) | kernel32.dll |
void ColorizeEscapeSequences(TextWriter, IntPtr, string, UInt16, UInt16) | bool SetConsoleTextAttribute(IntPtr, UInt16) | kernel32.dll |
void ColorizeEscapeSequences(TextWriter, IntPtr, string, UInt16, UInt16) | bool SetConsoleTextAttribute(IntPtr, UInt16) | kernel32.dll |
void ColorizeEscapeSequences(TextWriter, IntPtr, string, UInt16, UInt16) | bool SetConsoleTextAttribute(IntPtr, UInt16) | kernel32.dll |
Class NLog.Win32.Targets.OutputDebugStringTarget: | ||
void Write(LogEventInfo) | void OutputDebugString(string) | kernel32.dll |
Class NLog.Win32.ASPHelper: | ||
ASPHelper/ISessionObject GetSessionObject() | int CoGetObjectContext(Guid&, ASPHelper/IObjectContext&) | ole32.dll |
ASPHelper/IApplicationObject GetApplicationObject() | int CoGetObjectContext(Guid&, ASPHelper/IObjectContext&) | ole32.dll |
ASPHelper/IRequest GetRequestObject() | int CoGetObjectContext(Guid&, ASPHelper/IObjectContext&) | ole32.dll |
ASPHelper/IResponse GetResponseObject() | int CoGetObjectContext(Guid&, ASPHelper/IObjectContext&) | ole32.dll |
Calling Method | Mono method that throws NotImplementedException | |
Class NLog.Internal.FileAppenders.BaseFileAppender: | ||
FileStream WindowsCreateFile(string, bool) | int Marshal.GetHRForLastWin32Error() | |
Class NLog.Internal.FileAppenders.MutexMultiProcessFileAppender: | ||
bool GetFileInfo(DateTime&, Int64&) | SafeFileHandle FileStream.get_SafeFileHandle() | |
bool GetFileInfo(DateTime&, Int64&) | IntPtr SafeHandle.DangerousGetHandle() | |
Class NLog.LayoutRenderers.PerformanceCounterLayoutRenderer: | ||
void InvalidatePerformanceCounter() | void PerformanceCounter.Close() | |
void Append(StringBuilder, LogEventInfo) | Single PerformanceCounter.NextValue() | |
Class NLog.Targets.WebServiceTarget: | ||
void InvokeSoap11(Object[]) | void WebRequest.set_Method(string) | |
void InvokeSoap11(Object[]) | void WebRequest.set_ContentType(string) | |
void InvokeSoap11(Object[]) | WebHeaderCollection WebRequest.get_Headers() | |
void InvokeSoap11(Object[]) | Stream WebRequest.GetRequestStream() | |
void InvokeSoap11(Object[]) | WebResponse WebRequest.GetResponse() | |
void InvokeSoap12(Object[]) | void WebRequest.set_Method(string) | |
void InvokeSoap12(Object[]) | void WebRequest.set_ContentType(string) | |
void InvokeSoap12(Object[]) | Stream WebRequest.GetRequestStream() | |
void InvokeSoap12(Object[]) | WebResponse WebRequest.GetResponse() | |
void InvokeHttpPost(Object[]) | void WebRequest.set_Method(string) | |
void InvokeHttpPost(Object[]) | void WebRequest.set_ContentType(string) | |
void InvokeHttpPost(Object[]) | Stream WebRequest.GetRequestStream() | |
void InvokeHttpPost(Object[]) | WebResponse WebRequest.GetResponse() | |
Class NLog.Win32.Targets.MSMQTarget: | ||
void Write(LogEventInfo) | bool MessageQueue.Exists(string) | |
void Write(LogEventInfo) | MessageQueue MessageQueue.Create(string) | |
void Write(LogEventInfo) | void MessageQueue.Send(Object) | |
Message PrepareMessage(LogEventInfo) | void Message.set_Label(string) | |
Message PrepareMessage(LogEventInfo) | void Message.set_Recoverable(bool) | |
Message PrepareMessage(LogEventInfo) | void Message.set_Priority(MessagePriority) | |
Message PrepareMessage(LogEventInfo) | void Message.set_Body(Object) | |
Message PrepareMessage(LogEventInfo) | Stream Message.get_BodyStream() | |
Class NLog.Win32.Targets.PerfCounterTarget: | ||
void Write(LogEventInfo) | Int64 PerformanceCounter.Increment() | |
void InitializePerfCounter() | void PerformanceCounter.Close() | |
void InitializePerfCounter() | bool PerformanceCounterCategory.Exists(string) | |
void InitializePerfCounter() | bool PerformanceCounterCategory.CounterExists(string, string) | |
void InitializePerfCounter() | bool PerformanceCounterCategory.Exists(string) | |
void InitializePerfCounter() | void PerformanceCounterCategory.Delete(string) |
Calling Method | Method with [MonoTodo] | Reason |
Class NLog.Internal.FileAppenders.BaseFileAppender: | ||
FileStream WindowsCreateFile(string, bool) | int Marshal.GetHRForLastWin32Error() | Not Specified |
Class NLog.Internal.FileAppenders.MutexMultiProcessFileAppender: | ||
bool GetFileInfo(DateTime&, Int64&) | IntPtr SafeHandle.DangerousGetHandle() | Not Specified |
Class NLog.LayoutRenderers.PerformanceCounterLayoutRenderer: | ||
void InvalidatePerformanceCounter() | void PerformanceCounter.Close() | Not Specified |
void Append(StringBuilder, LogEventInfo) | Single PerformanceCounter.NextValue() | Not Specified |
Class NLog.Targets.MailTarget: | ||
void SendMessage(MailMessage) | void SmtpClient..ctor(string, int) | Load default settings from configuration. |
void SendMessage(MailMessage) | void SmtpClient.Send(MailMessage) | Need to work on message attachments. |
Class NLog.Win32.Targets.EventLogTarget: | ||
void UpdateEventLogSource() | bool EventLog.SourceExists(string, string) | Support remote machines |
void UpdateEventLogSource() | string EventLog.LogNameFromSourceName(string, string) | Support remote machine |
void UpdateEventLogSource() | void EventLog.DeleteEventSource(string, string) | Support remote machine |
void UpdateEventLogSource() | void EventLog.CreateEventSource(EventSourceCreationData) | Support remote machine |
void UpdateEventLogSource() | void EventLog.CreateEventSource(EventSourceCreationData) | Support remote machine |
Class NLog.Win32.Targets.MSMQTarget: | ||
void Write(LogEventInfo) | bool MessageQueue.Exists(string) | Not Specified |
void Write(LogEventInfo) | MessageQueue MessageQueue.Create(string) | Not Specified |
void Write(LogEventInfo) | void MessageQueue..ctor(string) | Not Specified |
void Write(LogEventInfo) | void MessageQueue.Send(Object) | Not Specified |
Message PrepareMessage(LogEventInfo) | void Message..ctor() | Not Specified |
Message PrepareMessage(LogEventInfo) | void Message.set_Label(string) | Not Specified |
Message PrepareMessage(LogEventInfo) | void Message.set_Recoverable(bool) | Not Specified |
Message PrepareMessage(LogEventInfo) | void Message.set_Priority(MessagePriority) | Not Specified |
Message PrepareMessage(LogEventInfo) | void Message.set_Body(Object) | Not Specified |
Message PrepareMessage(LogEventInfo) | Stream Message.get_BodyStream() | Not Specified |
Class NLog.Win32.Targets.PerfCounterTarget: | ||
void Write(LogEventInfo) | Int64 PerformanceCounter.Increment() | Not Specified |
void InitializePerfCounter() | void PerformanceCounter.Close() | Not Specified |
void InitializePerfCounter() | bool PerformanceCounterCategory.Exists(string) | Not Specified |
void InitializePerfCounter() | bool PerformanceCounterCategory.CounterExists(string, string) | Not Specified |
void InitializePerfCounter() | bool PerformanceCounterCategory.Exists(string) | Not Specified |
void InitializePerfCounter() | void PerformanceCounterCategory.Delete(string) | Not Specified |
Calling Method | P/Invoke Method | External DLL |
Class AspectSharp.Lang.GacHelper: | ||
IAssemblyEnum CreateGACEnum() | void CreateAssemblyEnum(IAssemblyEnum&, IntPtr, IAssemblyName, ASM_CACHE_FLAGS, IntPtr) | fusion.dll |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.Components.Common.EmailSender.Smtp.SmtpSender: | ||
void set_Timeout(int) | void SmtpClient.set_Timeout(int) | Check to make sure an email is not being sent. |
void Send(Message) | void SmtpClient.SendAsync(MailMessage, Object) | Not Specified |
void Send(Message) | void SmtpClient.Send(MailMessage) | Need to work on message attachments. |
MailMessage CreateMailMessage(Message) | void Attachment..ctor(Stream, string) | Not Specified |
MailMessage CreateMailMessage(Message) | void Attachment..ctor(string, string) | Not Specified |
void ConfigureSender(Message) | void SmtpClient.set_Port(int) | Check to make sure an email is not being sent. |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.Core.Logging.DiagnosticsLogger: | ||
void .ctor(string, string, string) | bool EventLog.SourceExists(string, string) | Support remote machines |
void .ctor(string, string, string) | void EventLog.CreateEventSource(EventSourceCreationData) | Support remote machine |
Calling Method | Method not yet in Mono | |
Class Castle.Facilities.DynamicLoader.DynamicLoaderFacility: | ||
AppDomain CreateAppDomain(IConfiguration) | void AppDomainSetup.set_DisallowApplicationBaseProbing(bool) |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.Facilities.DynamicLoader.DynamicLoaderFacility: | ||
AppDomain CreateAppDomain(IConfiguration) | AppDomain AppDomain.CreateDomain(string, Evidence, AppDomainSetup) | Currently it does not allow the setup in the other domain |
Calling Method | Method not yet in Mono | |
Class Castle.Facilities.Remoting.RemotingFacility: | ||
void SetUpRemotingConfiguration() | void RemotingConfiguration.Configure(string, bool) |
Calling Method | Method not yet in Mono | |
Class Castle.MonoRail.Framework.Views.Aspx.WebFormsViewEngine/ExecutePageProvider: | ||
Page ExecutePage(IRailsEngineContext) | void HttpServerUtility.Execute(string, bool) |
Calling Method | Mono method that throws NotImplementedException | |
Class Castle.MonoRail.Framework.CacheAttribute: | ||
void Castle.MonoRail.Framework.ICachePolicyConfigurer.Configure(HttpCachePolicy) | void HttpCachePolicy.SetValidUntilExpires(bool) |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.MonoRail.Framework.CacheAttribute: | ||
void Castle.MonoRail.Framework.ICachePolicyConfigurer.Configure(HttpCachePolicy) | void HttpCachePolicy.SetValidUntilExpires(bool) | Not Specified |
Calling Method | Mono method that throws NotImplementedException | |
Class Castle.MonoRail.Generator.Generators.ControllerGenerator: | ||
void GenerateController(CodeDomProvider, string, string, string, string, String[], TextWriter) | void CodeDomProvider.GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions) | |
void GenerateTestCase(CodeDomProvider, string, string, string, string, String[], TextWriter) | void CodeDomProvider.GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions) |
Calling Method | P/Invoke Method | External DLL |
Class AspectSharp.Lang.GacHelper: | ||
IAssemblyEnum CreateGACEnum() | void CreateAssemblyEnum(IAssemblyEnum&, IntPtr, IAssemblyName, ASM_CACHE_FLAGS, IntPtr) | fusion.dll |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.Components.Common.EmailSender.Smtp.SmtpSender: | ||
void set_Timeout(int) | void SmtpClient.set_Timeout(int) | Check to make sure an email is not being sent. |
void Send(Message) | void SmtpClient.SendAsync(MailMessage, Object) | Not Specified |
void Send(Message) | void SmtpClient.Send(MailMessage) | Need to work on message attachments. |
MailMessage CreateMailMessage(Message) | void Attachment..ctor(Stream, string) | Not Specified |
MailMessage CreateMailMessage(Message) | void Attachment..ctor(string, string) | Not Specified |
void ConfigureSender(Message) | void SmtpClient.set_Port(int) | Check to make sure an email is not being sent. |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.Core.Logging.DiagnosticsLogger: | ||
void .ctor(string, string, string) | bool EventLog.SourceExists(string, string) | Support remote machines |
void .ctor(string, string, string) | void EventLog.CreateEventSource(EventSourceCreationData) | Support remote machine |
Calling Method | Method not yet in Mono | |
Class Castle.Facilities.DynamicLoader.DynamicLoaderFacility: | ||
AppDomain CreateAppDomain(IConfiguration) | void AppDomainSetup.set_DisallowApplicationBaseProbing(bool) |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.Facilities.DynamicLoader.DynamicLoaderFacility: | ||
AppDomain CreateAppDomain(IConfiguration) | AppDomain AppDomain.CreateDomain(string, Evidence, AppDomainSetup) | Currently it does not allow the setup in the other domain |
Calling Method | Method not yet in Mono | |
Class Castle.Facilities.Remoting.RemotingFacility: | ||
void SetUpRemotingConfiguration() | void RemotingConfiguration.Configure(string, bool) |
Calling Method | Method not yet in Mono | |
Class Castle.MonoRail.Framework.Views.Aspx.WebFormsViewEngine/ExecutePageProvider: | ||
Page ExecutePage(IRailsEngineContext) | void HttpServerUtility.Execute(string, bool) |
Calling Method | Mono method that throws NotImplementedException | |
Class Castle.MonoRail.Framework.CacheAttribute: | ||
void Castle.MonoRail.Framework.ICachePolicyConfigurer.Configure(HttpCachePolicy) | void HttpCachePolicy.SetValidUntilExpires(bool) |
Calling Method | Method with [MonoTodo] | Reason |
Class Castle.MonoRail.Framework.CacheAttribute: | ||
void Castle.MonoRail.Framework.ICachePolicyConfigurer.Configure(HttpCachePolicy) | void HttpCachePolicy.SetValidUntilExpires(bool) | Not Specified |
Calling Method | Mono method that throws NotImplementedException | |
Class Castle.MonoRail.Generator.Generators.ControllerGenerator: | ||
void GenerateController(CodeDomProvider, string, string, string, string, String[], TextWriter) | void CodeDomProvider.GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions) | |
void GenerateTestCase(CodeDomProvider, string, string, string, string, String[], TextWriter) | void CodeDomProvider.GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions) |
影响迁移的四大问题
MoMA会检查到的主要有下列四种问题 :
Missing Methods
该问题是因为使用的方法在Mono中尚未实现。依照编译程序的不同可能会看到不同的错误信息,如果用Mono编译的话,在编译时就会报错,可看到下列的讯息:
myfile.cs(22,16): error CS0117: 'xxxxxxxxxxxxxxxxx' does not contain a definition for 'xxxxxxxxxxxxxxx'
而如果用微软编译程序编译的话,则必须执行到该方法处才会跳出MissingMethodException的例外:
System.MissingMethodException: Method not found: xxxxxxxxxxxxxxxxxxx
MonoTodo
该问题是因为应用程序中存在标记有MonoTodo的方法。这标记是用来提醒开发人员尚须处理的地方,通常这代表着方法尚未实现完全,或是实现完后开发者忘了将该标记移除。
NotImplementedException
该问题是因为应用程序中存在会丢出NotImplementedException的方法。
P/Invokes
该问题是因为应用程序中存在着平台调用。平台调用通常是用来调用非托管的方法,尤其是平台本身提供的方法。
命令行执行
MoMa从1.9版开始就已支持命令行执行的功能。
若要用命令行设定要检查的组件并启动MoMa,可以像下面这样:
MoMA C:\app\myapp.exe |
若要用设定加入多个要检查的组件并启动MoMa,可以像下面这样:
MoMA C:\app\myapp.exe C:\app\myapp.dll C:\app\myapp2.dll |
若不想带出MoMa界面,可通过--nogui设定并指定组件的位置,像是:
MoMA --nogui C:\app\myapp.exe |
执行完后,在命令提示字符看不到任何信息,须自行开启报表查看,其报表会存放在MoMa目录下的Reports目录内。若要自行指定报表位置,可透通过 --out来设定,并指派输出的报表文件位置,像是:
MoMA --nogui --out C:\app\momareport\report.html C:\app\myapp.exe |