再谈 C# 交互窗口

Ubuntu 10.10 操作系统中自带的是 mono 2.6.7:

[email protected]:~$ cat /etc/issue
Ubuntu 10.10 \n \l

[email protected]:~$ mono --version
Mono JIT compiler version 2.6.7 (Debian 2.6.7-3ubuntu1)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
	TLS:           __thread
	GC:            Included Boehm (with typed GC and Parallel Mark)
	SIGSEGV:       altstack
	Notifications: epoll
	Architecture:  amd64
	Disabled:      none
[email protected]:~$ gmcs --version
Mono C# compiler version 2.6.7.0
[email protected]:~$ csharp --version
Mono C# compiler version 2.1.0.0
[email protected]:~$ which csharp
/usr/bin/csharp
[email protected]:~$ cat /usr/bin/csharp
#!/bin/sh
exec /usr/bin/mono $MONO_OPTIONS /usr/lib/mono/2.0/csharp.exe "[email protected]"
[email protected]:~$

目前最新版本是 mono 2.8.1。因此,在 Ubuntu 10.10 操作系统中安装 mono 2.8.1 :

[email protected]:~/src$ wget http://ftp.novell.com/pub/mono/sources/mono/mono-2.8.1.tar.bz2
[email protected]:~/src$ tar xjf mono-2.8.1.tar.bz2
[email protected]:~/src$ rm mono-2.8.1.tar.bz2
[email protected]:~/src$ cd mono-2.8.1
[email protected]:~/src/mono-2.8.1$ ./configure --prefix=/opt/mono-2.8.1
[email protected]:~/src/mono-2.8.1$ make
[email protected]:~/src/mono-2.8.1$ sudo make install

然后看看安装后的效果:

[email protected]:~/src/mono-2.8.1$ cd /opt/mono-2.8.1
[email protected]:/opt/mono-2.8.1/bin$ ./mono --version
Mono JIT compiler version 2.8.1 (tarball 2010年 12月 01日 星期三 08:50:53 CST)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
	TLS:           __thread
	SIGSEGV:       altstack
	Notifications: epoll
	Architecture:  amd64
	Disabled:      none
	Misc:          debugger softdebug
	LLVM:          supported, not enabled.
	GC:            Included Boehm (with typed GC and Parallel Mark)
[email protected]:/opt/mono-2.8.1/bin$ ./dmcs --version
Mono C# compiler version 2.8.1.0
[email protected]:/opt/mono-2.8.1/bin$ ./csharp --version
Mono C# compiler version 4.0.0.0
[email protected]:/opt/mono-2.8.1/bin$ cat csharp
#!/bin/sh
exec /opt/mono-2.8.1/bin/mono $MONO_OPTIONS /opt/mono-2.8.1/lib/mono/4.0/csharp.exe "[email protected]"

然后把 Ubuntu 10.10 操作系统中的 /opt/mono-2.8.1/lib/mono/4.0/csharp.exe 文件拷贝到安装了 Microsoft .NET Framework 4 的 Microsoft Windows Server 2003 R2 Enterprise Edition Service Pack2 操作系统中,运行 csharp.exe:

C:\bin\CsharpRepl> csharp

未经处理的异常:  System.IO.FileNotFoundException: 未能加载文件或程序集
“Mono.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756”
或它的某一个依赖项。系统找不到指定的文件。
   在 Mono.Driver.Startup(String[] args)
   在 Mono.Driver.Main(String[] args)

哎呀,运行出错了。还需要一个 Mono.CSharp.dll 才能运行。让我们来找出这个 Mono.CSharp.dll 吧:

[email protected]:/opt/mono-2.8.1$ find . -name Mono.CSharp.dll
./lib/mono/4.0/Mono.CSharp.dll
./lib/mono/2.0/Mono.CSharp.dll
./lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll
./lib/mono/gac/Mono.CSharp/2.0.0.0__0738eb9f132ed756/Mono.CSharp.dll
[email protected]:/opt/mono-2.8.1$ ll lib/mono/4.0/Mono.CSharp.dll
lrwxrwxrwx 1 root root 60 2010-12-01 09:07 lib/mono/4.0/Mono.CSharp.dll
     -> ../gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll
[email protected]:/opt/mono-2.8.1$ ll lib/mono/gac/Mono.CSharp/4.0.0.0*/Mono.CSharp.dll
-rwxr-xr-x 1 root root 1105408 2010-12-01 09:07
 lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll
[email protected]:/opt/mono-2.8.1$

因此,把 Ubuntu 操作系统中上述 gac 目录中的 Mono.CSharp.dll 拷贝到 Windows 操作系统中,再次运行 csharp.exe :

C:\bin\CsharpRepl> dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F0AA-2E0D

 C:\bin\CsharpRepl 的目录

2010-12-01  10:13              .
2010-12-01  10:13              ..
2010-12-01  09:07            37,376 csharp.exe
2010-12-01  09:07         1,105,408 Mono.CSharp.dll
               2 个文件      1,142,784 字节
               2 个目录  9,746,513,920 可用字节

C:\bin\CsharpRepl> csharp

C:\bin\CsharpRepl>

这次运行没有出错,而是直接退出了。这更糟糕了。只好找到 csharp.exe 的 C# 源程序看看发生了什么。

[email protected]:/opt/mono-2.8.1/bin$ cd ~/src/mono-2.8.1
[email protected]:~/src/mono-2.8.1$ find . -name csharp
./mcs/tools/csharp
./scripts/csharp
[email protected]:~/src/mono-2.8.1$ cd mcs/tools/csharp
[email protected]:~/src/mono-2.8.1/mcs/tools/csharp$ ll
总计 56
-rw-r--r-- 1 ben ben  2434 2010-11-12 18:32 ChangeLog
-rw-r--r-- 1 ben ben    60 2010-11-12 18:24 csharp.exe.sources
-rw-r--r-- 1 ben ben 22963 2010-11-12 18:24 getline.cs
-rw-r--r-- 1 ben ben   672 2010-11-12 18:24 Makefile
-rw-r--r-- 1 ben ben 16749 2010-11-12 18:24 repl.cs
[email protected]:~/src/mono-2.8.1/mcs/tools/csharp$

上面的 repl.cs 就是 csharp.exe 的 C# 源程序之一,其中包含 Main 方法。下面是 repl.cs 的开头部分:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

//

//
repl.cs: Support for using the compiler in interactive mode (read-eval-print loop)

//

//
Authors:

//  
Miguel de Icaza ([email protected])

//

//
Dual licensed under the terms of the MIT X11 or GNU GPL

//

//
Copyright 2001, 2002, 2003 Ximian, Inc (http://www.ximian.com)

//
Copyright 2004, 2005, 2006, 2007, 2008 Novell, Inc

//

//

//
TODO:

//  
Do not print results in Evaluate, do that elsewhere in preparation for Eval refactoring.

//  
Driver.PartialReset should not reset the coretypes, nor the optional types, to avoid

//     
computing that on every call.

//

using System;

using System.IO;

using System.Text;

using System.Globalization;

using System.Collections;

using System.Reflection;

using System.Reflection.Emit;

using System.Threading;

using System.Net;

using System.Net.Sockets;

using System.Collections.Generic;

using Mono.CSharp;

namespace Mono
{

    public class Driver
{

        

        static int Main
(
string []
args)

        {

#if
!ON_DOTNET

            if (args.Length
> 0 && args [0] ==
"--attach")
{

                new ClientCSharpShell
(Int32.Parse (args [1])).Run (
null);

                return 0;

            }

            if (args.Length
> 0 && args [0].StartsWith (
"--agent:"))
{

                new CSharpAgent
(args [0]);

                return 0;

            }

#endif

            return Startup(args);

        }

        static int Startup
(
string[]
args)

        {

            string[]
startup_files;

            try {

                startup_files
= Evaluator.InitAndGetStartupFiles (args);

                Evaluator.DescribeTypeExpressions
=
true;

                Evaluator.SetInteractiveBaseClass
(
typeof (InteractiveBaseShell));

            }
catch {

                return 1;

            }

            return new CSharpShell
().Run (startup_files);

        }

    }

}

问题就出在第 52 行到第 65 行的 Startup 方法中。因此在该方法中增加一些 Debug 语句:

代码

        static int Startup (string[] args)
        {
            string[] startup_files;
            try {
                startup_files = Evaluator.InitAndGetStartupFiles (args);
                Evaluator.DescribeTypeExpressions = true;
                Evaluator.SetInteractiveBaseClass (typeof (InteractiveBaseShell));
            } catch (Exception ex) {
              // Begin Add by Ben (http://www.cnblogs.com/skyivben)
              Console.WriteLine(ex);
              // End   Add by Ben (Wed 2010-12-01)
                return 1;
            }

            return new CSharpShell ().Run (startup_files);
        }

然后重新编译:

[email protected]:~/src/mono-2.8.1$ make
[email protected]:~/src/mono-2.8.1$ sudo make install

再将重新编译后的 csharp.exe 拷贝到 Windows 操作系统中运行:

C:\bin\CsharpRepl> csharp
System.TypeLoadException: 重写成员
“Mono.CSharp.StreamReportPrinter.Print(Mono.CSharp.AbstractMessage)”
时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。
   在 Mono.CSharp.Evaluator.InitAndGetStartupFiles(String[] args)
   在 Mono.Driver.Startup(String[] args)

C:\bin\CsharpRepl>

运行时出错信息如上所示。经查,Mono.CSharp 命名空间中的 StreamReportPrinter 类继承自同一命名空间中的 ReportPrinter 类,这两个类的源程序代码均在 src/mono-2.8.1/mcs/mcs/report.cs 文件中,该文件中的相关内容如下所示:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

namespace Mono.CSharp
{

    //

    //
Generic base for any message writer

    //

    public abstract class ReportPrinter
{

        ///
<summary> 

        ///  
Whether to dump a stack trace on errors.

        ///
</summary>

        public bool Stacktrace;

        

        int warnings,
errors;

        public int WarningsCount
{

            get {
return warnings;
}

        }

        

        public int ErrorsCount
{

            get {
return errors;
}

        }

        protected virtual string FormatText
(
string txt)

        {

            return txt;

        }

        //

        //
When (symbols related to previous ...) can be used

        //

        public virtual bool HasRelatedSymbolSupport
{

            get {
return true;
}

        }

        public virtual void Print
(AbstractMessage msg)

        {

            if (msg.IsWarning)

                ++warnings;

            else

                ++errors;

        }

        protected void Print
(AbstractMessage msg, TextWriter output)

        {

            StringBuilder
txt =
new StringBuilder
();

            if (!msg.Location.IsNull)
{

                txt.Append
(msg.Location.ToString ());

                txt.Append
(
"
"
);

            }

            txt.AppendFormat
(
"{0}
CS{1:0000}: {2}"
,
msg.MessageType, msg.Code, msg.Text);

            if (!msg.IsWarning)

                output.WriteLine
(FormatText (txt.ToString ()));

            else

                output.WriteLine
(txt.ToString ());

            if (msg.RelatedSymbols
!=
null)
{

                foreach (string s
in msg.RelatedSymbols)

                    output.WriteLine
(s + msg.MessageType +
")");

            }

        }

    }

    class StreamReportPrinter
: ReportPrinter

    {

        readonly TextWriter
writer;

        public StreamReportPrinter
(TextWriter writer)

        {

            this.writer
= writer;

        }

        public override void Print
(AbstractMessage msg)

        {

            Print
(msg, writer);

            base.Print
(msg);

        }

    }

}

从上面的源程序代码中,我看不出为什么在 Windows 操作系统中运行时会出现“重写成员 ... 时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。”的错误。这个 csharp.exe 程序在 Linux 操作系统中运行是很正常的。

园子中的各位大侠有什么建议吗?请在评论中告诉我。谢谢!

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-10-26 16:39:40

再谈 C# 交互窗口的相关文章

三谈 C# 交互窗口

mono 2.8.1 中和 csharp.exe 和 Mono.CSharp.dll 相关的 C# 源程序总共只有六十个左右,分布在以下目录中: Mono.CSharp.dll 需要以下57个 C# 源文件: ..\..\mcs\anonymous.cs ..\..\mcs\argument.cs ..\..\mcs\assign.cs ..\..\mcs\attribute.cs ..\..\mcs\cs-tokenizer.cs ..\..\mcs\cfold.cs ..\..\mcs\cl

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

Another Look at Events(再谈Events)

转载:http://www.qtcn.org/bbs/simple/?t31383.html Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不错的文章,是2004年季刊的一篇文章,网上有这篇文章的翻译版,但是感觉部分地方翻译的比较粗糙,不是很明确.索性重新翻译了一遍,并引用了原翻译版的一段译注.以下都是用自己能理解的方式来翻译的,由于水平有限,有很多不足的地方,希望大家指正. Another Look at Events (再谈Event

VS 2015相当不错的功能:C#交互窗口

按照惯例,老周是先吹牛后讲正事.今天就给大伙吹吹这个事. 有网友不知道是不是昨晚喝高了,居然研究起老周来了.实话告诉你,老周没什么好研究的,老周又不是编译器,老周只是一个游离于大善大恶之间的平凡人,说来也只不过是: 无故寻愁觅恨,有时似傻如狂.纵然生得好皮囊,腹内原来草莽.潦倒不通世务,愚顽怕读文章.行为偏僻性乖张,那管世人诽谤! 老周上不行圣人之道,下不通小人之事,渺渺乎,悠悠于人世间的一颗微尘罢了.所以,不要研究老周了. 网友感兴趣,老周你是怎么学到编程了的,而且还完全自学的. 唉,要说起这

再谈MFC学习——模态对话框的数据传递

学习c++的目的就是为了使用封装好的类,而最最经典的封装类当然是微软的MFC窗口程序类.学习MFC编程之前要学习c++的主要知识,掌握c++的基本编程思想.下面就看下我学习的MFC模态对话框的数据传递. 首先,什么叫做模态对话框呢?模态对话框指的是当弹出这样的对话框的时候,程序不能相应除了此对话框外其他的窗口的响应,直到关闭了这个对话框,程序才能响应其他的对话框的响应.非模态对话框即使弹出也能响应程序其他的窗口而不需要等到此窗口的关闭.那么MFC中怎么才能弹出模态对话框呢?其实很简单,首先创建这

再谈 Go 语言在前端的应用前景

12 月 23 日,七牛云 CEO & ECUG 社区发起人许式伟先生在 ECUG Con 2018 现场为大家带来了主题为<再谈 Go 语言在前端的应用前景>的内容分享. 本文是对演讲内容的实录整理. 今年是举办 ECUG Con 的第 11 年,之前我谈的基本都是服务端的开发实践.从去年起我开始不谈后端而是谈前端.当然,去年我没有说为什么我会关注前端.今天再谈 Go 语言在前端的应用之前,我先简单聊一下思路脉络,为什么我今天会关注前端. 前端的演进 最早的 PC 时期,常见的设备主

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

再谈MySQL全库备份

再谈MySQL全库备份 简介 Part1:写在最前 在很早之前,我写过一个MySQL生产库全库备份脚本,今天有同事问我是不是要再加一个-R参数来备份存储过程,理由的话是由于mysqldump --help中 关于存储过程的默认备份是false. routines                          FALSE MySQL生产库全库备份脚本 http://suifu.blog.51cto.com/9167728/1758022 实战 Part1:写在最前 我备份一般就三个参数 --s