ページ 1 / 1
バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 04:19
by inemaru
お世話になります。
PowerShellのbat起動ワンライナーにおける、埋め込みC#コードについて
ReferencedAssemblies オプションによる.Net向けDxLibライブラリ(dll)の読み込みで分からないことがあり質問しました。
バッチファイルのディレクトリに存在する「DxLibDotNet.dll」を呼び出した際に、
下記のようなエラーで、実行時にエラーしてしまいます。
※「DxLib.dll」「DxLib_x64.dll」も同ディレクトリに配置しています。
コード:
"1" 個の引数を指定して "Run" を呼び出し中に例外が発生しました: "ファイルまたはアセンブリ 'DxLibDotNet, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。"
コード側の問題かもしれませんが、
正常に、読み込む方法は無いでしょうか?
コードは、下記の通りです。
► スポイラーを表示
※エラーの再現用に抜粋したものです
環境:Windows10
コード:
@setlocal enabledelayedexpansion&set a=%*&(if defined a set a=!a:"=\"!&set a=!a:'=''!)&@start /min powershell -windowstyle hidden -sta /c $i=$input;iex ('$i^|^&{$PSCommandPath=\"%~f0\";$PSScriptRoot=\"%~dp0";#'+(${%~f0}^|Out-String)+'} '+('!a!'-replace'[$(),;@`{}]','`$0'))&exit/b
<#
・C#挙動確認用テンプレート
バッチファイルのみでC#開発を行う検証
#>
<#
ユーザー向け定義
#>
# 管理者権限
set-variable -option readonly -name ENABLE_ADMIN -value "false"
<#
スクリプト向け定義
#>
# アプリケーション名
set-variable -option readonly -name APP_NAME -value "C#挙動確認用テンプレート"
# フォームサイズ
set-variable -option readonly -name FORM_SIZE -value "640, 480"
set-variable -option readonly -name FORM_MIN_SIZE -value $FORM_SIZE
# DLLパス
set-variable -option readonly -name DLL_PATH_DXLIBDOTNET -value (Join-Path $PSScriptRoot "DxLibDotNet.dll")
# アプリケーションファイル名
set-variable -option readonly -name APP_FILE_NAME -value (Split-Path -Leaf $PSCommandPath)
set-variable -option readonly -name APP_FILE_BASE_NAME -value (Get-Item $APP_FILE_NAME).BaseName
#<# -------------------------------------------------------------------------------------------------------
Add-Type -IgnoreWarnings -Language CSharpVersion3 `
-ReferencedAssemblies (
# "System",
"System.Drawing",
"System.Windows.Forms",
$DLL_PATH_DXLIBDOTNET
) `
-TypeDefinition @"
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Principal;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using DxLibDLL;
public class MainForm : Form
{
public MainForm()
{
if (Admin.IsAdmin) {
this.Text = "$APP_NAME (管理者)";
}
else {
this.Text = "$APP_NAME";
}
this.FormBorderStyle = FormBorderStyle.Sizable;
this.Size = new Size($FORM_SIZE);
this.MinimumSize = new Size($FORM_MIN_SIZE);
this.FormClosed += MainForm_FormClosed;
DX.DxLib_Init();
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
DX.DxLib_End();
}
public void MainLoop()
{
}
}
public static class Admin
{
public static bool RestartAdmin(Object[] Args)
{
if (IsAdmin) {
return true;
}
var psi = new ProcessStartInfo("cmd", string.Format("/C \"\"{0}\" {1}\"",
@"$PSCommandPath",
string.Join(" ", Args
.Select(x => string.Format("\"{0}\"", x))
.ToArray())));
psi.Verb = "runas";
try {
Process.Start(psi);
}
catch (System.ComponentModel.Win32Exception){}
return false;
}
public static bool IsAdmin
{
get {
var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
}
}
public static class Entry
{
[STAThread]
public static void Run(Object[] Args)
{
#if $ENABLE_ADMIN
if (Admin.RestartAdmin(Args)) {
MainProc(Args);
}
#else
MainProc(Args);
#endif
}
static void MainProc(Object[] Args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new MainForm();
form.Show();
while( form.Created )
{
form.MainLoop();
Application.DoEvents();
}
}
}
"@
# -------------------------------------------------------------------------------------------------------#>
# アセンブリ読み込み
#Add-Type -Assembly System.Windows.Forms
try
{
# 実行
[Entry]::Run($args)
}
catch [Exception] {
# 例外
PowerShell -WindowStyle Normal -Command Exit
Write-Host $error
Write-Host "`n終了するには、任意のキーを押してください." -NoNewLine
[Console]::ReadKey() | Out-Null
}
finally {
# プロセス解放
[GC]::Collect()
}
PowerShellは興味本位で触っている程度なので、初心者です。
プログラム全般では、C++の入門書レベルが多少わかる程度です。
bat起動ワンライナーで、動作させることを目的としているので
「C# Interactiveでやれば良い」等の開発環境を変更するような
回答は、お控え頂けると助かります。
以上、よろしくお願い致します。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 08:43
by Math
この様な”ヒアーーストリング”によるコンパイルは(C#3)は今(C#6)では無意味です。VS2015はMicrosoftさんが長年の失敗を乗り越え遂にコンパイラの一本化に成功した初のコンパイラでありcsc.exeで全てが出来るのでこのような方法を用い無くても簡単に実現できます。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 12:09
by Math
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 13:26
by Math
なをPowerShellはプログラミング言語でもありFormも簡単に作れます。
# アセンブリ読み込み
#Add-Type -Assembly System.Windows.Forms
は一切不要でいきなり書き出せます。VisualStudioのようにインテリセンスが働きます。
http://csi.nisinippon.com/ps--1.png
http://csi.nisinippon.com/ps--2.png
http://csi.nisinippon.com/ps--3.png
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 13:47
by inemaru
Math さんが書きました:この様な”ヒアーーストリング”によるコンパイルは(C#3)は今(C#6)では無意味です。VS2015はMicrosoftさんが長年の失敗を乗り越え遂にコンパイラの一本化に成功した初のコンパイラでありcsc.exeで全てが出来るのでこのような方法を用い無くても簡単に実現できます。
この方法は、VS2015をインストールしていない環境や、Windows7の標準機能で使用可能な方法でしょうか。
開発は、Windows10で行いましたが、使用環境は、Windows7~Windows10にしたいと考えています。
(OSの標準機能で動かしたいので、C# Interactiveを避けていました。)
他に、
スクリプトに対する、引数の取得だったり、管理者権限まわりの動作が、
気になります。
Math さんが書きました:
# アセンブリ読み込み
#Add-Type -Assembly System.Windows.Forms
は一切不要でいきなり書き出せます。VisualStudioのようにインテリセンスが働きます。
(初心者なので、間違ってるかもしれませんが)
staticメソッド等を使用する際にオブジェクトを取得してから使うのは、微妙と感じました。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 14:54
by Math
>bat起動ワンライナーで、動作させることを目的としているので
マウス Wクリックで大丈夫です。
>(初心者なので、間違ってるかもしれませんが)
>staticメソッド等を使用する際にオブジェクトを取得してから使うのは、微妙と感じました。
間違ってる。staticメソッドを使用する際にオブジェクトを取得してから使うのではなく[クラス名]でつかう!
大抵のグロバール関数(メソッド)はそうです。
http://csi.nisinippon.com/ps--a.png
Asin,Acos・・・・staticメソッです。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 15:09
by inemaru
Math さんが書きました:>bat起動ワンライナーで、動作させることを目的としているので
マウス Wクリックで大丈夫です。
OS標準機能で、動けばCSIを使用しますが
配布とかするのに環境依存になるのは避けたいです。
(対象はWindows7~Windows10を想定しています)
Math さんが書きました:
>staticメソッド等を使用する際にオブジェクトを取得してから使うのは、微妙と感じました。
間違ってる。staticメソッドを使用する際にオブジェクトを取得してから使うのではなく[クラス名]でつかう!
大抵のグロバール関数(メソッド)はそうです。
http://csi.nisinippon.com/ps--a.png
Asin,Acos・・・・staticメソッです。
あれ?
先ほどのレスの画像ってNew-Objectでもできるよって話じゃないんですか?
[クラス名]で使うのは、わかってるつもりです。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 15:25
by Math
>OS標準機能で、動けばCSIを使用しますが
>配布とかするのに環境依存になるのは避けたいです。
>(対象はWindows7~Windows10を想定しています)
落ち着いてよく読むこと。中学生向きに書いたのだから。
>あれ?
>先ほどのレスの画像ってNew-Objectでもできるよって話じゃないんですか?
>[クラス名]で使うのは、わかってるつもりです。
訳の分からない質問が多い。具体的にかくこと!!!
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 15:39
by Math
[具体論を書くこと。抽象論にしないこと。]
----------------------------------------------
ルールのテンプレートです。(皆さんこういう感じに書かれています)
[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか
[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 16:06
by inemaru
Math さんが書きました:>OS標準機能で、動けばCSIを使用しますが
>配布とかするのに環境依存になるのは避けたいです。
>(対象はWindows7~Windows10を想定しています)
落ち着いてよく読むこと。中学生向きに書いたのだから。
このリンクですよね。
http://csi.nisinippon.com/index.html
さっき目を通したときに、「VS2015」だったり「csi」の文言があったので
環境依存だと思って読んでいたのですが、間違っていたでしょうか。
とりあえず、読み進めてみます。
Math さんが書きました:
なをPowerShellはプログラミング言語でもありFormも簡単に作れます。
# アセンブリ読み込み
#Add-Type -Assembly System.Windows.Forms
は一切不要でいきなり書き出せます。VisualStudioのようにインテリセンスが働きます。
Math さんが書きました:
>あれ?
>先ほどのレスの画像ってNew-Objectでもできるよって話じゃないんですか?
>[クラス名]で使うのは、わかってるつもりです。
訳の分からない質問が多い。具体的にかくこと!!!
ISEを使用して、プログラムを書くとAdd-Type不要ですが、
バッチ起動で行う場合は必要です。
staticメソッドを使用するのにオブジェクトを使用する話は
Add-Type不要の話の流れで混乱した為、誤解によって出てきました。
環境については、明記しているのですから、
ISE使用時とかの文言が欲しかったです。
下記参照
► スポイラーを表示
Add-Typeするバッチ
コード:
@setlocal enabledelayedexpansion&set a=%*&(if defined a set a=!a:"=\"!&set a=!a:'=''!)&@start /min powershell -windowstyle hidden -sta /c $i=$input;iex ('$i^|^&{$PSCommandPath=\"%~f0\";$PSScriptRoot=\"%~dp0";#'+(${%~f0}^|Out-String)+'} '+('!a!'-replace'[$(),;@`{}]','`$0'))&exit/b
# アセンブリ読み込み
Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("test")
Add-Typeしないバッチ(エラー)
[codepowrshell]
@setlocal enabledelayedexpansion&set a=%*&(if defined a set a=!a:"=\"!&set a=!a:'=''!)&@start /min powershell -windowstyle hidden -sta /c $i=$input;iex ('$i^|^&{$PSCommandPath=\"%~f0\";$PSScriptRoot=\"%~dp0";#'+(${%~f0}^|Out-String)+'} '+('!a!'-replace'[$(),;@`{}]','`$0'))&exit/b
# アセンブリ読み込み
# Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("test")
[/code]
オフトピック
入れ違いになったので、質問フォーマットに関しては、この後対応します。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 16:20
by Math
はなしが支離滅裂におもえるので質問フォーマットに主要点1点にしぼって(ゆっくり考えて)ください。(すぐの返事は無用う)そして詳し状況を書いてください。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 16:41
by inemaru
- 質問文
- 自分が今行いたい事は何か
バッチ起動のPowerShell埋め込みワンライナーを使用して
Add-TypeでC#コードを使用する際し、.Net用のDXライブラリを使用したいと思います。
なぜ、ps1の形式をとっていないのかというと、セキュリティ設定が必要になったりし、
使用者側に手間がかかるためです。
batの形式に埋め込むことで、ユーザー側の手順として起動するだけで済みます。
PowerShellは、Windows7標準なので、新たにインストールする/させる必要がない為、使用しています。
(OSさえあれば、使用者の環境に依存しない)
- どのように取り組んだか(プログラムコードがある場合記載)
Windows7~Windows10の環境で、バッチファイルにプログラムを埋め込んだ状態で起動させるために
下記のコードを作成しました。
► スポイラーを表示
コード:
@setlocal enabledelayedexpansion&set a=%*&(if defined a set a=!a:"=\"!&set a=!a:'=''!)&@start /min powershell -windowstyle hidden -sta /c $i=$input;iex ('$i^|^&{$PSCommandPath=\"%~f0\";$PSScriptRoot=\"%~dp0";#'+(${%~f0}^|Out-String)+'} '+('!a!'-replace'[$(),;@`{}]','`$0'))&exit/b
<#
・C#挙動確認用テンプレート
バッチファイルのみでC#開発を行う検証
#>
<#
ユーザー向け定義
#>
# 管理者権限
set-variable -option readonly -name ENABLE_ADMIN -value "false"
<#
スクリプト向け定義
#>
# アプリケーション名
set-variable -option readonly -name APP_NAME -value "C#挙動確認用テンプレート"
# フォームサイズ
set-variable -option readonly -name FORM_SIZE -value "640, 480"
set-variable -option readonly -name FORM_MIN_SIZE -value $FORM_SIZE
# DLLパス
set-variable -option readonly -name DLL_PATH_DXLIBDOTNET -value (Join-Path $PSScriptRoot "DxLibDotNet.dll")
# アプリケーションファイル名
set-variable -option readonly -name APP_FILE_NAME -value (Split-Path -Leaf $PSCommandPath)
set-variable -option readonly -name APP_FILE_BASE_NAME -value (Get-Item $APP_FILE_NAME).BaseName
#<# -------------------------------------------------------------------------------------------------------
Add-Type -IgnoreWarnings -Language CSharpVersion3 `
-ReferencedAssemblies (
# "System",
"System.Drawing",
"System.Windows.Forms",
$DLL_PATH_DXLIBDOTNET
) `
-TypeDefinition @"
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Principal;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using DxLibDLL;
public class MainForm : Form
{
public MainForm()
{
if (Admin.IsAdmin) {
this.Text = "$APP_NAME (管理者)";
}
else {
this.Text = "$APP_NAME";
}
this.FormBorderStyle = FormBorderStyle.Sizable;
this.Size = new Size($FORM_SIZE);
this.MinimumSize = new Size($FORM_MIN_SIZE);
this.FormClosed += MainForm_FormClosed;
DX.DxLib_Init();
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
DX.DxLib_End();
}
public void MainLoop()
{
}
}
public static class Admin
{
public static bool RestartAdmin(Object[] Args)
{
if (IsAdmin) {
return true;
}
var psi = new ProcessStartInfo("cmd", string.Format("/C \"\"{0}\" {1}\"",
@"$PSCommandPath",
string.Join(" ", Args
.Select(x => string.Format("\"{0}\"", x))
.ToArray())));
psi.Verb = "runas";
try {
Process.Start(psi);
}
catch (System.ComponentModel.Win32Exception){}
return false;
}
public static bool IsAdmin
{
get {
var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
}
}
public static class Entry
{
[STAThread]
public static void Run(Object[] Args)
{
#if $ENABLE_ADMIN
if (Admin.RestartAdmin(Args)) {
MainProc(Args);
}
#else
MainProc(Args);
#endif
}
static void MainProc(Object[] Args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new MainForm();
form.Show();
while( form.Created )
{
form.MainLoop();
Application.DoEvents();
}
}
}
"@
# -------------------------------------------------------------------------------------------------------#>
# アセンブリ読み込み
#Add-Type -Assembly System.Windows.Forms
try
{
# 実行
[Entry]::Run($args)
}
catch [Exception] {
# 例外
PowerShell -WindowStyle Normal -Command Exit
Write-Host $error
Write-Host "`n終了するには、任意のキーを押してください." -NoNewLine
[Console]::ReadKey() | Out-Null
}
finally {
# プロセス解放
[GC]::Collect()
}
- どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
Add-Type の ReferencedAssemblies でライブラリの読み込みに失敗している
もしくは、読み込み自体はできているけれど、実行時にエラーしているような状況です。
コード:
"1" 個の引数を指定して "Run" を呼び出し中に例外が発生しました: "ファイルまたはアセンブリ 'DxLibDotNet, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。"
手始めにDXライブラリのDLLを使用しただけなので、
今後、他のDLLを読み込むことも想定しています。
- 今何がわからないのか、知りたいのか
エラー原因を含め、
Add-Type の ReferencedAssemblies で読み込みを行ったライブラリを
C#コードの部分で正常(エラーなし)に使用する方法が知りたいです。
- 環境
- OS
Windows 10 Pro
- コンパイラ名
コンパイラ名に相当する情報かわかりませんが、
PowerShell2.0で動作することを想定しています。
- その他
- どの程度C言語を理解しているか
C言の理解度は、初心者以下です。
C++は入門書レベルの内容であれば、多少理解できます。
- ライブラリを使っている場合は何を使っているか
DxLibDotNet(Ver3.16f)
不明点等ありましたら、ご指摘ください。
追記します。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 17:00
by Math
では1点主要点と思われるDxLibDotNet.dllの読み込みについて。
[Answer]
DxLibDotNet.dllはGACにおかれたReferencedAssemblies ではないのでその命令では読み込めないのは当然である。別の命令で読む事。
以上。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 17:11
by inemaru
ReferencedAssembliesってGAC関係なくないですか?
自作の.Net向けDLLはカレントディレクトリに配置し使用できました。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 17:25
by Math
それなら2つのdllを同じにして実験せよ。¥!(いまいそがしのに..)
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 17:31
by Math
もっともっと自分で考えろ。そうしたらもっと大きな間違いに気付くはず。①時間はかけてかんがえろ!
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 17:44
by inemaru
Math さんが書きました:それなら2つのdllを同じにして実験せよ。¥!(いまいそがしのに..)
もっともっと自分で考えろ。そうしたらもっと大きな間違いに気付くはず。①時間はかけてかんがえろ!
別に、即時に回答が欲しいわけでないので、
忙しいのであれば、レスは後でも構いません。
自分で考えて解決しなかったので、質問しているのです。
あと、もっと大きな間違えを指摘してください。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 17:51
by Math
(PowerShellでもVersion格差が大きいところ。dllを読み込む命令は現に使ってるよ。C#3なんて古い時代は命令が少なかった。それは置いといても別の大きな問題の方が...)
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 18:11
by Math
(私のホームページにPowerShellとC#とVBについてかなり詳しく書いたはずなのでよんでみて)
http://powershell-vb-memo.nisinippon.com/
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 18:25
by Math
このプログラムはPowerSell_iseでテストしましたか?(動きました?)
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 18:25
by Math
このプログラムはPowerSell_iseでテストしましたか?(動きました?)
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 18:39
by inemaru
今現在確認できた事として、
ReferencedAssembliesで自作DLLの読み込みを行えるが、
環境によっては例外が発生する。(Windows8.1環境で、呼び出した段階で例外が発生した)
dllの読み込みで、.Netのバージョンが依存となる点が問題といった感じでしょうか。
現在の方法だと問題がありそうなので方針を変更して、
C#のコードで、うまくバージョン選択して参照を追加する方法がないか調べてみます。
読んでみます。
Math さんが書きました:このプログラムはPowerSell_iseでテストしましたか?(動きました?)
ISEではテストしていませんが、動かない気がします。
(もともとISEで動作させる予定はなかった為)
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月04日(土) 23:51
by Math
ふと気が付いたら”なぜC#のコンパイルに”PowerShellのAdd-Typeがいるのか?!
必要なのはDLLの参照設定だろう!!
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月05日(日) 00:21
by Math
Add-Type -Path ./DxLibDotNet.dll だけでいいはずが
[DxLibDLL] クラス表示ができない!
C#で自作したらよめるのに..
---DxLibDotNet.dll はWin32のラッパークラスのDLLだから読める訳がない..
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月05日(日) 00:36
by Math
うっかりしてました。よく確かめなっかたですね。
コンパイル:/r:は参照設定
コード:
#Add-Type -Path ./DxLibDotNet.dll
#[DxLibDLL]::
csc /r:DxLibDotNet.dll cs1.cs
ls cs*
結果
コード:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2017/02/04 7:37 cs
-a---- 2017/02/03 20:15 1287 cs1 - コピー.cs
-a---- 2017/02/05 0:08 1348 cs1.cs
-a---- 2017/02/05 0:29 4096 cs1.exe
PS D:\z\04\ps>
[/size]
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月05日(日) 00:52
by Math
このヒアー・ストリングは動作しました。
コード:
$source = @"
using System;
class Hello {
static void Main() {
Console.WriteLine("Hello World!");
}
}
public static class ClassTest{
public static void MainMethod() {
Console.WriteLine("MainMethod: Hello World!");
}
}
public class ClassObjTest{
public void MainObjMethod() {
Console.WriteLine("MainObjMethod: Hello World!");
}
}
"@
Add-Type -TypeDefinition $source -Language CSharp -OutputAssembly `
"cs.exe" -OutputType ConsoleApplication
./cs.exe
copy cs.exe cs.dll
Add-Type -Path ./cs.dll
[ClassTest]::MainMethod()
$obj = New-Object ClassObjTest
$obj.MainObjMethod()
コード:
PS D:\z\04\ps> D:\z\04\ps\p1.ps1
Hello World!
MainMethod: Hello World!
MainObjMethod: Hello World!
PS D:\z\04\ps>
[/size]
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月06日(月) 00:15
by inemaru
結論としては、
「バッチ埋め込みのPowerShellでC#コードに任意のライブラリを使用する事はできない」
とします。
Assemblyのメンバを使用してできなくもなかったですが、
本来はコンパイル時の指定で事足りるはずなので不毛。
PowerShellのみで実装する場合は、動作しますが、
Add-TypeのC#コード中で任意のライブラリを使用/読み出すには制約があるようです。
(自作のDLL内で使用される.Netバージョンが指定できない為、環境によってエラーする)
結局、
inemaru さんが書きました:
エラー原因を含め、
Add-Type の ReferencedAssemblies で読み込みを行ったライブラリを
C#コードの部分で正常(エラーなし)に使用する方法が知りたいです。
は、解決していませんが、
エラー原因が分かったということで
とりあえず、解決とします。
ありがとうございました。
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月07日(火) 23:34
by Math
http://csi.nisinippon.com/Dx_ps.png
Windowsのみの機能で
PowerSell_iseでDxLibのProgramがヒアー・ストリングで正常にコンパイル・実行されることを確認しました。
コード:
$source = @"
using DxLibDLL;
class Program
{
static int Main(string[] args)
{
DX.ChangeWindowMode(DX.TRUE);
DX.DxLib_Init();
DX.DrawString(30, 20, "How do you do", DX.GetColor(255, 255, 255));
DX.WaitKey();
DX.DxLib_End();
return 0;
}
}
"@
Add-Type -TypeDefinition $source -Language CSharp -ReferencedAssemblies "DxLibDotNet.dll" `
-OutputAssembly "Program.exe" -OutputType ConsoleApplication
.\Program.exe #実行
コード:
PS D:\z\07\ps> ls Prog*
ディレクトリ: D:\z\07\ps
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2017/02/07 23:18 4096 Program.exe
PS D:\z\07\ps>
Re: バッチ起動のPowerShellでDLLの読み込みに失敗する
Posted: 2017年2月08日(水) 19:29
by Math
[雑談]
PowerSell_iseでC#,xaml,VBのビルドをUnix命令で行ってきたがWindows10-1670にはLinuxやMacOSでお馴染みの"bash"がインストールされていた!。
それを有効化したところLinux(ウブンツウ)がインストールされ本格的にUnixが使えるようになった。”Emacs"もインストールできるようです。
Linux,Mac,Windows皆Unixになった。(もっともWindowsは10年以上前からUnix(POSIXhttps://ja.wikipedia.org/wiki/POSIX)として認定されていますが。)
富士通さんにもリモコンでPCをみてもらったが”初めてです”とのことでした。
コード:
qtunix@FMV_W81:/mnt/c/Windows/System32$ pwd
/mnt/c/Windows/System32
qtunix@FMV_W81:/mnt/c/Windows/System32$ id
uid=1000(qtunix) gid=1000(qtunix) groups=1000(qtunix),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev)
qtunix@FMV_W81:/mnt/c/Windows/System32$ hostname
FMV_W81
qtunix@FMV_W81:/mnt/c/Windows/System32$ uname -a
Linux FMV_W81 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
qtunix@FMV_W81:/mnt/c/Windows/System32$ --version
--version: コマンドが見つかりません
qtunix@FMV_W81:/mnt/c/Windows/System32$ bash --version
GNU bash, バージョン 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
qtunix@FMV_W81:/mnt/c/Windows/System32$ ^C
[/size]
http://ascii.jp/elem/000/001/148/1148878/