小技 - YuukiReiya/MyFramework GitHub Wiki

Git

別のgitアカウントでリポジトリをCloneする方法

HTTPS

##本当?
git clone https://${GIT_USER}:${GIT_TOKEN}@github.com/${GIT_REPOSITORY}

#これでできた
$git clone https://[PersonalAccessToken]@github.com/[USERNAME or COMPANYNAME]/[REPOSITORYNAME].git

1.該当アカウントにてGithubでPersonalAccessTokenを発行する。

IDisaposable

  • usingで囲った処理を抜けると自動で呼ばれる。 (usingで囲った場合内部で早期リターンした場合でも呼ばれるようになるらしい。)
  • async/awaitを使う際IDisposable型をusingで囲うと処理を抜ける際にDisposeが呼ばれるため、 疑似的に寿命をオブジェクトに紐づけることができる。
  • Dispose.Create関数を利用することでIDisposableを継承せずDisposeを定義できる。

▽参考 https://youtu.be/1akdhfINXdA?t=355


NativePlugin(.dll)

◆1. *.dllの関数で文字列を返したい。

P/Invoke

case 1: 戻り値が文字列

C++

extern "C" {
	__declspec(dllexport) char* __stdcall function() 
	{
		std::string str = "文字列";
		char* buffer = new char[str.size() + 1];// 終端文字分 +1
		strcpy_s(buffer, str.size() + 1, str.c_str());
		return buffer;
	}
}

strcpy_sの第2引数の_SizeInBytesに文字列長+1されているのがポイント。 ※+1をしないとエラーが出る。

C#

delegate IntPtr T();
void function()
{
  using(var lpFile =new NativePluginsFactor($"DLLのパス"))
  {
     var func = lpFile.GetDelegate<T>($"function");
     var ptr = func();

     // 呼び出した関数のアドレスが返ってくる。
     byte[] buffer = new byte[6];// 文字列バッファー ※日本語は1文字2Byte = MultiByte
     int i = 0;
     while(i<buffer.Length)
     {
       // 戻り値の想定される文字数分読み込んでバッファーに積む。
       buffer[i] = Marshal.ReadByte(ptr,i);
       i++;
     }

     // 読み込んだバッファーを文字列に変換.
     string str = null;

     // UTF-8
     str = System.Text.Encoding.UTF8.GetString(buffer);

     // SHIFT-JIS
     //Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
     //str = System.Text.Encoding.GetEncoding("shift_jis").GetString(buffer);

     // 表示.
     Console.WriteLine($"str={str}");
  }
}

文字列サイズが異なるのでこのやり方を利用する場合255など固定長で統一したほうがいい。 C++:str.size() + 1 C# :6

↓ 別方

delegate IntPtr T();
void function()
{
  using(var lpFile =new NativePluginsFactor($"DLLのパス"))
  {
     var func = lpFile.GetDelegate<T>($"function");
     var ptr = func();

     // UTF-8
     string str = Marshal.PtrToStringUTF8(ptr);
     // ANSI
     //string str = Marshal.PtrToStringAnsi(ptr);     

     // 表示.
     Console.WriteLine($"str={str}");
  }
}

バッファサイズ未定義でいい。動的なメモリ確保ができる。 ただし、こっちを採用した場合はANSISHIFT-JISで微妙に違うらしく一部対応されない文字(旧字体)があるらしいので注意が必要。 とはいえDLLに移植するような内容で旧字体が必要な場面はないはずなのでSHIFT-JISもしくはUTF-8でいいはずなので特に気にしなくてよさそう。 C#コンソールアプリケーションで動作確認したもののUnity上で下記のエラーを確認した。

ExecutionEngineException: String conversion error: Illegal byte sequence encounted in the input.
System.Runtime.InteropServices.Marshal.PtrToStringUTF8 (System.IntPtr ptr) (at <e40e5a8f982c4b618a930d29f9bd091c>:0)

おとなしく固定長バッファを利用するか、もしくは文字列を介さない実装が求められる。 (DLL内部で確保したメモリを開放するメソッドの呼び出しが必要になるため)

case 2:out メモリにメッセージを入れる


Shader

  • HLSLコードフォーマッター → 拡張子.shader(.hlslじゃない)だから機能しなくね。 CGPROGRAMHLSLPROGRAM + ENDHLSLにすればHLSL使える GLSLPROGRAM

▽参考 https://marketplace.visualstudio.com/items?itemName=TimGJones.HLSLToolsforVisualStudio

  • ShaderlabVS シンタックスハイライト付くし、補完も利きそうでいい感じ。 コードフォーマット掛からないのが難点。

▽リンク https://marketplace.visualstudio.com/items?itemName=ShaderlabVS2019.ShaderlabVS

  • フォーマットが掛かるようにする

VS2022 ツール/⚙オプション/テキスト エディター/ファイル拡張子/ → 拡張子:shader エディター:<任意>

▽参考 https://www.weed.nagoya/entry/2017/07/01/140243