前回 書いたように、【OpenGL】シリーズは
「ホントーに、アッタマ来たっ!!! 」
と感じた表記から始めましょう。
「OpenTK導入格闘記」とあるように、C#でOpenGLを使うユーティリティライブラリー(T ool K it、という名ですが)があるということで、ちょっと調べてみたのが運の尽き、というお話です。
ここ で書いていますが、
大本山は ここ
ということは直ぐに分かりました。
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
OpenTK で GLControl を使おうとすると、
" 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 のバージョンがプロジェクトに含まれているバージョンより新しいということを意味します。
この問題を解決するためには、次のようなステップで対処できます:
バージョンの確認と更新 :
プロジェクトで使用している OpenTK と OpenTK.GLControl のバージョンを確認し、両方とも同じバージョン(この場合は 3.3.3.0 )に統一します。これは、 NuGet パッケージマネージャーを使用して更新することができます。
NuGet パッケージの更新 :
Visual Studio の場合、ソリューションエクスプローラーでプロジェクトを右クリックし、「 NuGet パッケージの管理」を選択します。
「アップデート」タブをクリックして、利用可能なアップデートを確認します。
OpenTK と OpenTK.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.GLControl が 3.3.3.0 を要求している場合、実際には GLControl のバージョンを下げる必要があるか、あるいは存在しないバージョンに対する間違いがある可能性が考えられます。 Visual Studio を使用していない場合、コマンドラインで csc.exe を使ってコンパイルする際のオプション設定について説明します。
まず、正しいバージョンの DLL ファイルを指定するために、次のようにコマンドラインからコンパイルを行います:
必要な DLL を指定する : コンパイル時に参照 DLL として OpenTK.dll と OpenTK.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.dll と OpenTK.GLControl.dll を参照します。
注記 : もし OpenTK.GLControl.dll がバージョン 3.3.3.0 を要求しているにも関わらず、実際には 3.3.1.0 しか存在しない場合、 GLControl のバージョンを見直すか、そのバージョンが誤っている(または誤って表示されている)可能性があるので、パッケージの配布元に確認することも検討してください。
User
現在 OpenTK が発行している NetFrame 用の OpenTK.dll は 3.3.1.0 、 OpenTK.GLControl.dll は 3.3.3.0 しかありません。 従って他の dll は使えません。仮にコンパイルする際に xaml ファイルで <dependentAssembly>
<assemblyIdentity><bindingRedirect> で回避できるのであれば、 Xaml ファイルのサンプルと MSBuild の使い方を教えてください。
ChatGPT
Visual Studio や MSBuild を使用していない場合に、手動で 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.GLControl は 3.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. アセンブリのバージョンを統一する
もし可能であれば、プロジェクトで使用されている OpenTK と OpenTK.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.dll の version を 3.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サイトの運営者の方には注意を促したいですね。