小技 - 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}");
}
}
バッファサイズ未定義でいい。動的なメモリ確保ができる。
ただし、こっちを採用した場合は
ANSI
↔SHIFT-JIS
で微妙に違うらしく一部対応されない文字(旧字体)があるらしいので注意が必要。とはいえDLLに移植するような内容で旧字体が必要な場面はないはずなので
C#コンソールアプリケーションで動作確認したもののUnity上で下記のエラーを確認した。SHIFT-JIS
もしくはUTF-8
でいいはずなので特に気にしなくてよさそう。
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じゃない)だから機能しなくね。CGPROGRAM
→HLSLPROGRAM
+ENDHLSL
にすればHLSL使える ※GLSLPROGRAM
▽参考 https://marketplace.visualstudio.com/items?itemName=TimGJones.HLSLToolsforVisualStudio
- ShaderlabVS シンタックスハイライト付くし、補完も利きそうでいい感じ。 コードフォーマット掛からないのが難点。
▽リンク https://marketplace.visualstudio.com/items?itemName=ShaderlabVS2019.ShaderlabVS
- フォーマットが掛かるようにする
VS2022 ツール/⚙オプション/テキスト エディター/ファイル拡張子/ → 拡張子:shader エディター:<任意>