前回書いたように、【OpenGL】シリーズは

 

ホントーに、アッタマ来たっ!!!

 

と感じた表記から始めましょう。

 

「OpenTK導入格闘記」とあるように、C#でOpenGLを使うユーティリティライブラリー(Tool Kit、という名ですが)があるということで、ちょっと調べてみたのが運の尽き、というお話です。

 

ここで書いていますが、

 

大本山はここ

 

ということは直ぐに分かりました。

 

1.OpenTKとは
OpenTKとはOpen Tool Kitの意味らしく、C#で「OpenGL、OpenCL、OpenAL(」)のラッパーライブラリーです。
:(1)OpenGL(Open Graphics Library)-クロスプラットフォームのグラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスのAPI。
(2)OpenCL(Open Computing Language)-クロスプラットフォームのは、マルチコアCPUやGPU、Cellプロセッサ、DSPなどによる異種混在の計算資源を利用した並列コンピューティングのためのAPI。
(3)OpenAL(Open Audio Library)-クロスプラットフォームのオーディオAPI。
 

要すれば、C#でOpenGLを使う為の(ほぼ唯一の)ライブラリーということです。
 

2.ダウンロード
MSCompAssは最新の.NETのC#ではなく、Version 4.8.9032.0 for C#5なので、OpenTKも(大本山のご指示通り、更新されないオワコンの感がある).NET Framework向けのVersion 3.xを使用しました。(OpenTK.GLControlはVersion 3.3.3)



しかし、様々なWebの記事ではVisual Studioを使ってダウンロードした圧縮ファイル(*.nupkg)を展開しており、ダウンロードしたファイルを覗いても(苦手な)xamlファイルや不明の拡張子のついたファイルが色々あって、正直取り扱いに恐怖を覚えました。
:「なんだこりゃ?」と思いましたが、何のことはない。*.zipに書き換えるとzipファイルになります。
 

3.最初の躓き(どのようにOpenTKを使えばよいのか?)
どうやって使うのかについて調べるとほとんどの記事がVisual Studioベースで、(レジスター登録などが勝手に行われるとまた厄介なので)MSCompAssで単にDLLを参照するだけでよいのかどうか分からず、二の足を踏んでいました。

一旦は臍を噛みながら断念しようかと考えましたが、「単にダウンロードして、その中のdllを取り出して参照すればよい」と(後から考えればその通りなんですが)極めて簡潔、明快に書かれているある(やはりcsc.exeを単独で使う好き者の方の)Web記事を見つけてダウンロードを決意しました。

 

4.次の(致命的)躓き(OpenTKとOpenTK.GLControlのバージョン不一致問題)
大本山の.NET Framework用のVersion 3.xという奴はクリックするとVersion3.3.1で、

併用すべきOpenTKのGLControlというファイルはVersion 3.3.3になっていましたが、

「大本山がVersion 3.xの最終作を掲示しているのだから」と別に問題意識もなくダウンロードしました。そしてネットに出ているサンプルプログラム(GLControlを使うプログラム-注1)をコンパイルすると、

 

なんと、エラーになる!注2

 

じゃないですか?

注1:OpenTKは、ウィンドウコントロールで描画する為の"GLControl"と、メインウィンドウ自体でOpenGLが使える"GameWindow"という、二つの使い方があります。今回のエラーはGameWindowを使うプログラムではなく、GLControlを使うプログラムだけ発生しました。

注2:エラーの内容は、

"error CS1705: アセンブリ 'OpenTK.GLControl, Version=3.3.3.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4' は、参照されているアセンブリ 'OpenTK, Version=3.3.1.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4' よりも新しいバージョンを含む 'OpenTK, Version=3.3.3.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4' を使用します。(「んなもんねーよっ!」と腹が立ちました。)
OpenTK.dll: (以前のエラーに関連するシンボルの位置)
"
というもので、大本山の公開しているバージョンでは絶対にコンパイルできないことを意味します。

 

んな訳ないだろうっ!!!

 

ということで、様々なサイトを訪れ、エラー検索し、調べまくったが対応方法が分からりません。英文サイトでそれらしきものを見つけましたが、結局的「外れ」で、最後にCharGPT様々に縋ることになりました。

 

【OpenGPTとの問答】

User

C#コンパイラー(csc.exe C#5)に関する質問です。

ChatGPT

C#コンパイラ(csc.exe)について質問があれば、どうぞお聞かせください。C# 5.0に関する機能や、コンパイラの使用方法、エラー対応、またはその他何でもお答えしますので、具体的な質問を教えていただけると助かります。

User

OpenTKGLControlを使おうとすると、

"error CS1705: アセンブリ 'OpenTK.GLControl, Version=3.3.3.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4' は、参照されているアセンブリ 'OpenTK, Version=3.3.1.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4' よりも新しいバージョンを含む 'OpenTK, Version=3.3.3.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4' を使用します

OpenTK.dll: (以前のエラーに関連するシンボルの位置)"

というエラーが出ました。どのように対処すればよいでしょうか?

ChatGPT

提示されたエラーメッセージによると、OpenTKのプロジェクトで使用しているOpenTK.GLControlアセンブリがバージョン3.3.3.0であり、参照されているOpenTKアセンブリがバージョン3.3.1.0であるというバージョンの不一致が発生しています。これはOpenTK.GLControlが要求するOpenTKのバージョンがプロジェクトに含まれているバージョンより新しいということを意味します。

この問題を解決するためには、次のようなステップで対処できます:

バージョンの確認と更新

プロジェクトで使用しているOpenTKOpenTK.GLControlのバージョンを確認し、両方とも同じバージョン(この場合は3.3.3.0)に統一します。これは、NuGetパッケージマネージャーを使用して更新することができます。

NuGetパッケージの更新

Visual Studioの場合、ソリューションエクスプローラーでプロジェクトを右クリックし、「NuGetパッケージの管理」を選択します。

「アップデート」タブをクリックして、利用可能なアップデートを確認します。

OpenTKOpenTK.GLControlのパッケージを最新バージョンにアップデートします。

プロジェクトのリビルド

パッケージの更新後、プロジェクトをリビルドしてみてください。これにより、すべてのアセンブリが最新のバージョンに基づいて正しくリンクされるようになります。

依存関係の問題が解決しない場合:

パッケージをアンインストールし、再度インストールすることも検討してください。

依存関係の問題が引き続き発生する場合は、プロジェクトファイル(.csproj)を手動で開いて、関連するパッケージリファレンスのバージョンが正しく指定されているかを確認してください。

これらのステップを試してみてください。それでも問題が解決しない場合は、さらに具体的な設定やエラー情報を教えてください。

User

先ずOpenTK.dllにはバージョン3.3.3.0が存在しません。3.3.1.0が最新)従って依存関係を修正しなければなりませんが、Visual Studio(従って.csprojファイルやMSBuild)を使っていないので、csc.exeに与えるオプションを教えてください。

CharGPT

OpenTK.dllの最新バージョンが3.3.1.0であり、それに対してOpenTK.GLControl3.3.3.0を要求している場合、実際にはGLControlのバージョンを下げる必要があるか、あるいは存在しないバージョンに対する間違いがある可能性が考えられます。Visual Studioを使用していない場合、コマンドラインでcsc.exeを使ってコンパイルする際のオプション設定について説明します。

まず、正しいバージョンのDLLファイルを指定するために、次のようにコマンドラインからコンパイルを行います:

必要なDLLを指定する: コンパイル時に参照DLLとしてOpenTK.dllOpenTK.GLControl.dllを明示的に指定する必要があります。また、それぞれのDLLが適切なフォルダにあることを確認してください。

csc.exeのコマンドラインオプション: csc.exeでプロジェクトをコンパイルする基本的なコマンドラインは以下の通りです。パスは環境によって異なるため適宜読み替えてください。

csc.exe -reference:パス\OpenTK.dll;パス\OpenTK.GLControl.dll -out:アプリケーション名.exe ソースファイル名.cs

ここで、-referenceオプションで使用するDLLを指定し、-outで出力する実行可能ファイルの名前を指定します。

例:

csc.exe -reference:C:\libs\OpenTK.dll;C:\libs\OpenTK.GLControl.dll -out:MyApplication.exe Program.cs

このコマンドはProgram.csというソースファイルをコンパイルし、MyApplication.exeという名前の実行ファイルを生成し、C:\libs\ディレクトリにあるOpenTK.dllOpenTK.GLControl.dllを参照します。

注記: もしOpenTK.GLControl.dllがバージョン3.3.3.0を要求しているにも関わらず、実際には3.3.1.0しか存在しない場合、GLControlのバージョンを見直すか、そのバージョンが誤っている(または誤って表示されている)可能性があるので、パッケージの配布元に確認することも検討してください。

User

現在OpenTKが発行しているNetFrame用のOpenTK.dll3.3.1.0OpenTK.GLControl.dll3.3.3.0しかありません。従って他のdllは使えません。仮にコンパイルする際にxamlファイルで<dependentAssembly>

<assemblyIdentity><bindingRedirect>で回避できるのであれば、XamlファイルのサンプルとMSBuildの使い方を教えてください。

ChatGPT

Visual StudioMSBuildを使用していない場合に、手動でapp.configファイルにバインディングリダイレクトを設定する方法について説明します。この設定により、特定のバージョンのアセンブリを要求する際に、異なるバージョンのアセンブリが代わりに使用されるよう指示することができます。

app.configファイルにバインディングリダイレクトを追加

app.config ファイルの作成: ソースファイルがあるディレクトリに app.config ファイルを新規作成します。

バインディングリダイレクトの追加:

app.config ファイルに以下の内容を追加します。ここで、oldVersion にはリダイレクトする元のバージョン範囲、newVersion には使用する新しいバージョンを指定します。

xml

Copy code

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<runtime>

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

<dependentAssembly>

<assemblyIdentity name="OpenTK" publicKeyToken="bad199fe84eb3df4" culture="neutral" />

<bindingRedirect oldVersion="0.0.0.0-3.3.3.0" newVersion="3.3.1.0" />

</dependentAssembly>

<dependentAssembly>

<assemblyIdentity name="OpenTK.GLControl" publicKeyToken="bad199fe84eb3df4" culture="neutral" />

<bindingRedirect oldVersion="0.0.0.0-3.3.3.0" newVersion="3.3.3.0" />

</dependentAssembly>

</assemblyBinding>

</runtime>

</configuration>

この設定は、アプリケーションがOpenTKのどのバージョンを要求しても、3.3.1.0を使用するようにリダイレクトし、OpenTK.GLControl3.3.3.0をそのまま使用します。

プロジェクトのコンパイル:

csc.exe を使用してコンパイルを行い、生成された実行ファイルが app.config ファイルと同じディレクトリに存在することを確認します。そして、実行ファイルの名前が MyApplication.exe の場合、app.config MyApplication.exe.config にリネームします。

アプリケーションの実行:

コンパイルされたアプリケーションを実行する際には、リダイレクトの設定が読み込まれ、アセンブリのバージョン不一致が解消されるはずです。

これにより、アセンブリのバージョン不一致問題を解決することができます。ただし、実際にリダイレクトが適切に機能するかどうかは、プロジェクトの具体的な依存関係や実行環境によります。エラーが解消されない場合は、さらに詳細な設定調整が必要になることもあります。

User

このapp.configファイルはどのようにcsc.exeで使うのですか?

ChatGPT

実際には、csc.exe は直接 app.config ファイルを扱うことはありません。csc.exe はソースファイルからアセンブリ(例えば、.exe または .dll ファイル)を生成するコンパイラですが、設定ファイル(app.config)は実行時に .NET アプリケーションによって読み込まれます。

つまり、コンパイル時に csc.exe app.config を直接使用するわけではなく、アプリケーションの実行時に .NET ランタイムが対応する .config ファイルを使用します。そのため、コンパイル後のステップで app.config ファイルを正しく設定し、適切な場所に配置する必要があります。

コンパイル後の手順

アプリケーションのコンパイル:

csc.exe を使用してコンパイルを行います。

bash

Copy code

csc.exe -reference:OpenTK.dll;OpenTK.GLControl.dll -out:MyApplication.exe YourSourceFile.cs

app.config ファイルの配置:

コンパイルが完了したら、作成した app.config ファイルを、コンパイルで生成された実行可能ファイル(.exe)と同じディレクトリに配置し、ファイル名を <アプリケーション名>.exe.config に変更します。たとえば、実行ファイルが MyApplication.exe なら、設定ファイルは MyApplication.exe.config という名前にします。この操作により、アプリケーションを実行したときに .NET ランタイムが設定ファイルを読み込み、指定されたバインディングリダイレクトに従ってアセンブリをロードします。

重要な点

アセンブリのバージョンリダイレクトは、特定の問題を解決するための一時的な対処策として使用できますが、可能であれば、使用するアセンブリのバージョンを整合させることが最も良い解決策です。

.config ファイルは、アプリケーションの実行時設定を管理するためのものであり、コンパイラが直接操作するものではありません。

コンパイルとは無関係に、アプリケーションの実行環境において正しい設定ファイルが必要とされます。

User

しかし、csc.exeのコンパイル段階でエラーが出るので実行ファイルを生成できません。従って.configファイルも利用できません。どうすればよいでしょう。

ChatGPT

csc.exeのコンパイル段階でアセンブリのバージョン不一致によるエラーが発生している場合、そのエラーはコンパイル時に解決する必要があり、実行時の.configファイルでは対応できません。エラーを回避するためのアプローチは、以下の通りです:

1. アセンブリのバージョンを統一する

もし可能であれば、プロジェクトで使用されているOpenTKOpenTK.GLControlのバージョンを統一するのが最も簡単な解決策です。しかしながら、おっしゃるように、これらのバージョンが異なる場合、代わりの対策が必要です。

2. 代替のアセンブリを探す

もしOpenTK.GLControlの異なるバージョンが存在するなら(例えば、以前のバージョンでOpenTK 3.3.1.0と互換性のあるもの)、そのバージョンを探して使用することを検討してください。これは、バージョン不一致を解決し、コンパイルを可能にします。

3. ローカルでのアセンブリの再構築

ソースコードが利用可能であれば、OpenTK.GLControlをローカルで再構築し、OpenTK 3.3.1.0に依存するように調整することも一つの方法です。これには、ソースコードの編集とビルド環境の設定が必要になりますが、バージョンの互換性を自分で制御できるようになります。

4. ソースコードから直接問題を回避

特定の機能がOpenTK.GLControlで提供されているが、バージョン不一致により問題が発生している場合、その機能を直接OpenTKを使って実装する方法を検討することができます。これは、直接的な解決策ではありませんが、プロジェクトを進行させるための一時的な回避策となり得ます。

5. 環境を変えてみる

最終手段として、異なる開発環境やツールチェーン(例えば、Visual Studio.NET Coreなど)を試してみるのも一つの方法です。これにより、異なるバージョンのアセンブリがどのように扱われるかが変わる場合があります。

結論

これらの方法の中から適切なものを選択し、プロジェクトの要件と互換性を考慮に入れることが重要です。特に、ライブラリのソースコードへのアクセスが可能であれば、ローカルでの再構築が最も確実な解決策となるかもしれません。また、コミュニティや公式のサポートフォーラムで助言を求めるのも良いでしょう。

User

OpenTK.GLContorol.dllversion3.3.1.0に書き換える方法はありませんか?

ChatGPT

.dllファイルのバージョン番号を直接書き換えることは、一般的には推奨されません。なぜなら、アセンブリ自体の内部構造や依存関係が本当に一致しているか保証されないからです。しかし、特定の状況下で、アセンブリのメタデータを変更する必要がある場合、いくつかの方法があります。

アセンブリのバージョンを書き換える方法

IL (Intermediate Language) の編集:

アセンブリのILコードを編集することで、バージョン番号を変更することが可能です。これを行うためには、IL Disassembler (ILDasm) IL Assembler (ILAsm) が必要です。これらのツールは .NET SDK に含まれています。

ILDasmを使用してアセンブリをILコードに変換します。

出力されたILコードを編集し、アセンブリのバージョン番号を変更します。

ILAsmを使用してILコードからアセンブリを再構築します。

直接バイナリ編集:

非常にリスクが高く、通常は推奨されない方法ですが、バイナリエディタを使用してDLLファイルを直接開き、バージョン番号が格納されている部分を探して書き換えることも技術的には可能です。

アセンブリの再コンパイル:

ソースコードが利用可能な場合、アセンブリの情報ファイル (AssemblyInfo.cs または類似のファイル) でバージョン番号を変更してから、ソースからアセンブリを再コンパイルすることができます。

注意点と推奨

アセンブリのバージョンを変更することは、そのアセンブリが他のコンポーネントとどのように相互作用するかに影響を与える可能性があります。特に、バージョン番号がAPIの互換性やセキュリティチェックに使われている場合、問題が発生することがあります。

ライブラリのバージョンを変更する前に、その変更がライセンス条項や著作権に違反しないことを確認してください。

実際にバージョンを変更する前に、可能であればライブラリの開発者やメンテナーに問い合わせて、この問題の解決策についてアドバイスを求めることをお勧めします。

バージョンの書き換えが必要な場面はまれですが、他に解決策がない場合は、これらの方法を慎重に検討してください。

 

ChatGPTの回答を要すれば、

OpenTK.GLControl.dllのVersionが3.3.3なら、OpenTK.dllnoVersionも3.3.3でなければ、基本的にコンパイルできない。

という

死刑宣告

でした。

 

ということで

 

OpenTKの使用は断念しよう(泣;)

 

と思い、最後にもう一回だけwebを検索してみると、再検索の結果nugetの別の場所でOpenTK Version 3.3.3.0を見つけることが出来、

最終的な結解決に至りました。

 

なんてこったい!(でも、終わりよければすべてよし!)

 

GLControlを使ったプログラムもこれで無事、正常にコンパイルすることが出来るようになりました。やれやれ。

 

<問題点>
OpenTKの公式サイトでOpenTK Version 3.3.1.0とOpenTK.GLCOntrol 3.3.3.0を公開しているが、これはC# 5コンパイラーがVersion不一致エラー(error:CS1705)を起こす。実際にはOpenTK Version 3.3.3.0が nuget 上にあるが(https://www.nuget.org/packages/OpenTK/3.3.3)、これは余程注意深く検索しないと見つけられない。

 

この問題で多くの.NET FrameworkベースのユーザーはOpenTKの利用をあきらめてしまうのではないでしょうか?OpenTKサイトの運営者の方には注意を促したいですね。