
インポート置換! この非常に人気のある言葉は、今やナノテクノロジーさえも覆しています! それは大きな展望と多くの問題の両方をもたらします。 少し前にそれが私に影響を与えました。 私は、MSVSオペレーティングシステムでソフトウェアを起動することを任されました。 約8年前に前回見たLinuxと、私たちのソフトウェアは.Netで書かれていることを考えると、これは非常に興味深いことです。
MSVS OSの知識
そのため、 ウィキペディアは、MSVS OSは軍隊のモバイルシステムであると述べています。 つまり、安全な汎用オペレーティングシステムです。 その組織はVNIINSによって開発されました。 このシステムは、ロシア連邦国防省の要件に準拠したLinuxに基づいています。
システムには2つのブランチがあります。
- MSVS 3.0-2.4カーネルの32ビットバージョン。
- MSVS 5.0は、2.6カーネルを備えた64ビットバージョンです。
各ブランチには「変更」と呼ばれるいくつかのバージョンがあります。 最新の認定バージョンは次のとおりです。
- OS MSVS 3.0 FLIR。80001-12 rev No. 6;
- OS MSVS 5.0 TsAVM.11004-01 rev。 番号7。
システムの特定のバージョンは問題ステートメントで指定されていなかったため、VNIINSテクニカルサポートに相談した後、最も関連性の高いOS MSVS 5.0 TsAVM.11004-01 rev。 番号7。
公式バージョンを購入するのに約1か月かかり、ハードウェアを選択してシステムをインストールするのにさらに数日かかりました。 OS MSVS 5.0は、2つのビデオカードを搭載したx86プロセッサおよびラップトップにはインストールされていないと断言できます。
これは、MS OSVSのグラフィカルシェルの外観です。

製造元は、次のシステムパラメータを示しています。
- コマンド「uname -a」のビルド日:2013年2月1日。
- コア:2.6.32;
- QT:3.3.8b、4.8.5;
- gcc:4.1.2、4.4.7;
- glibc:2.5;
- KDE:3.5。
システムについて少し知りましたが、次の情報を受け取りました。
- MSVS 5.0 OSは、Red Hat Enterprice Linuxまたはその派生物に基づいています。
- カーネルのバージョンとビルドの日付から判断すると、これはRHEL 6.3です。
- Glibcライブラリは非常に古い:2006年9月から。
- 開発には、最初の鮮度ではなくQTを使用することをお勧めします。
この状況は、システムコンポーネントの認証の難しさに起因していると考えられます。
まあ、タスクはより具体的になりました。 次に、ソリューションを選択する必要があります。 それらの2つだけがあります。
- QTまたはglibcの下ですべてを書き換えます。
- Monoの機能を実行してみてください。
エネルギー、時間、神経を節約するために、2番目のオプションが選択されました。 このオプションの潜在的な問題は、原則としてすべてを正常に開始できないことと、Monoを使用したその後のソフトウェア認証の両方です。 ただし、すべてを書き換えるよりも高速で簡単です。
モノインストール
そして、モノとは何ですか? ウィキペディアはこれを示唆しています
フリーソフトウェアに基づいた.NET Frameworkシステムの本格的な実装を作成するプロジェクト。そしてそれも
Windows、Linux、BSD(FreeBSD、OpenBSD、NetBSD)、Solaris、Mac OS X、Apple iOS、Wiiなどのオペレーティングシステム用のMono実装が存在します。 サポートされるプラットフォーム:s390、SPARC、PowerPC、x86 / x86-64、IA64、ARM、Alpha、MIPS、HPPA。
プロジェクトのWebサイトにアクセスして、インストールに必要なコマンドは3つだけであることがわかります。
rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
-
yum-config-manager --add-repo download.mono-project.com/repo/centos
-
yum install mono-complete
最初のコマンドは署名キーを追加してリポジトリにアクセスし、2番目はリポジトリを構成し、3番目はMonoをインストールします。
ソフトウェアは、 RPMパッケージの形式でMSVS OSにインストールされます(RHELの後継製品と同様)。 このプロセスの便宜上、 YUMパッケージマネージャーがよく使用されます。 MSWS OSにはパッケージマネージャー用のグラフィカルシェルが含まれていますが、コンソールバージョンを使用しました。 パッケージはリポジトリにあり、リポジトリはローカルマシンまたはネットワーク上のどこかに配置できます。 YUMパッケージマネージャーでリポジトリにリンクを追加すると、システムを非常に便利に更新できます。 原則として、リポジトリはすでにRHELとその後継で追加および設定されていますが、MSVS OSではインストールCDにあるリポジトリは1つだけです。
問題はすでに2番目のチームで始まりました。
yum-config-manager
システムにないことが判明しました:

そのため、リポジトリを手動で追加する必要があります。 それらは
/etc/yum.repos.d
ディレクトリにあります。 そこで、
<reponame>.repo
を作成する必要があり
<reponame>.repo
。 たとえば、
mono.repo
です。 以下をこのファイルに追加する必要があります。
[mono_repository]
name=mono repository
baseurl=http://download.mono-project.com/repo/centos/
enabled=1
gpgcheck=0
ファイルを保存した後、
yum repolist
実行して、リポジトリが追加されたことを確認します。 この場合、配布ディスクを挿入してマウントする必要があります。 または、ディスク上のリポジトリを無効にする必要があります:
server.repo
ファイルで
enabled = 0
。
しかし、今は何も起こりませんでした:

エラー
[Errno -3] Error performing checksum
は、YUMがチェックサムを計算できないことを示します。 判明したように、リポジトリはYUMがカウントできない
sha256
ハッシュ関数を使用します。 経験豊富な人々は、この場合は
python-hashlib
をインストールする必要があると
python-hashlib
。 リポジトリが構成されていないため、 このバージョンを手動でインストールしました 。
その後、必要に応じてリポジトリを獲得しました:

しかし、Monoのインストールを完了できません。:

インストール中に、パッケージの依存関係がチェックされます。 このリポジトリからMonoをインストールするには、システムに以下のバージョンライブラリが必要であることが判明しました。
-
GLIBC_2.16
-
PNG15_0
-
LIBTIFF_4.0
-
LIBJPEG_6.2
これらすべてのライブラリを更新することもできますが、これを使用する他のソフトウェアの動作に問題が生じる可能性があります。
StackOverFlowによって別の解決策が得られました。Monoの以前のバージョンをインストールする必要があります。 バージョンのアーカイブがあります 。 経験的に、MSVS 5.0 TSAVM.11004-01 revに通常インストールされるMonoの最新バージョンを特定することができました。 7番はバージョン2.10.2です。 リポジトリはこちらです。
その結果、すべてをインストールするには、次のことを行う必要があります。
1.
/etc/yum.repos.d
リポジトリ
<reponame>.repo
ファイルを作成(または修正)します(例:
mono.repo
。
このファイルには次のものが含まれている必要があります。
[Mono]
name=Mono Stack (RHEL_5)
type=rpm-md
baseurl=http://origin-download.mono-project.com/archive/2.10.2/download/RHEL_5/
gpgcheck=1
gpgkey=http://origin-download.mono-project.com/archive/2.10.2/download/RHEL_5/repodata/repomd.xml.key
enabled=1
2.
yum install monotools-addon-server
コマンドを実行して、メインライブラリをインストールします。
3.
yum install mono-addon-winforms-2.10.2-5.1.x86_64
を実行して、
yum install mono-addon-winforms-2.10.2-5.1.x86_64
ライブラリをインストールします。
4.
yum install mono-addon-libgdiplus0.x86_64 0:2.10-6.2
を実行して、GDI +実装をインストールします。
他のライブラリをインストールできます。 配布パッケージの説明はここにあります 。 Monoは
/opt/novell/mono
インストールされ
/opt/novell/mono
。 Monoバージョン2.10.2には、2.0、3.5、および4.0の.Netバージョンが含まれています。
次のようにインストールを確認します。
- コマンド
source /opt/novell/mono/bin/mono-addon-environment.sh
環境を構成します -
mono --version
コマンドmono --version
バージョンを確認します
結果は次のようになります。

さらに、 いくつかのプログラムを実行してパフォーマンスを確認できます 。
移植の問題
使い慣れた環境で作業するために、同じバージョンの Mono for Windowsをインストールしました。
デバッグには、コンソールへの出力を使用すると便利です。 表示するには、
--debug
オプションを使用してアプリケーションを実行する必要があります。 たとえば、
mono --debug helloworld.exe
です。
Monoのみのコードを分離するために、VisualStudioで2つの新しい
MonoRelease
および
MonoDebug
構成を作成しました。

それぞれにコンパイラオプションを追加し、
/define MONO

これで、この構造を使用できます。
#if MONO #else #endif
もちろん、最初は何もうまくいきませんでした。 まず第一に-プロセスの名前を取得します。
var count = 0; foreach (var clsProcess in Process.GetProcesses()) { if(clsProcess.ProcessName.Contains(Process.GetCurrentProcess().ProcessName)) count++; }
このコードは、システムで実行されている同じプロセスの数を返します。 この問題は、不要なプロセスからの例外を無視することで解決しました。
var count = 0; foreach (var clsProcess in Process.GetProcesses()) { #if MONO try { #endif if(clsProcess.ProcessName.Contains(Process.GetCurrentProcess().ProcessName)) count++; #if MONO } catch { } #endif }
同時に、コードは引き続き機能を果たしました。
次に、フォーム上のボタンが「左」になります。 次のようになります。

そして、それは次のようになりました:

これは、フォーム上の要素の配置の小さな変更によって決定されました。
#if MONO tableLayoutPanel1.RowStyles[1].Height = 60; #endif
パスにも問題がありました。 Linuxでは、ディレクトリを区切るために文字
'/'
れますが、Windowsでは
'\'
です。 この問題は
System.IO.Path.DirectorySeparatorChar
を使用して解決されます。 この静的フィールドは、すべてのオペレーティングシステムで常に正しい値を持ちます。
しかし、主な問題はマーシャリングでした。 私たちのソフトウェアでは、
Marshal.StructureToPtr
と
Marshal.PtrToStructure
を使用して、特別にマークされたクラスをバイト配列にシリアル化し、ネットワークを介して伝送するためにその逆を行います。 さらに、クラスには複雑な階層とネストがあります。 Microfoft .NETはこのタスクに対応していますが、Monoはできませんでした。 これは、記憶を扱う際の違いの結果だと思います。
その結果、コードの非常に印象的な部分を書き直さなければならず、自動シリアル化を、配列からのクラスの「手動」アセンブリに置き換えました。
結果
その結果、問題は解決されました。 直接移植には約2週間かかりました。 もう1週間ほどで、Monoのインストールプロセスの調査が行われました。 そして、オペレーティングシステムの購入に1か月かかりました。
次は?
そして、Monoとソフトウェア自体を自動的にインストールする独自のリポジトリを作成する必要があります。 その後、認証があるはずです...
しかし、いつものように、すべてが最も興味深い場所で変更されました。 作業の最中に、MSWS OSはもはや関係ないことが判明しました。 AstraLinuxですべてを行う必要があります...そして、これは少し異なる話です。