バッチ起動のPowerShellでDLLの読み込みに失敗する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
inemaru
記事: 108
登録日時: 4年前

バッチ起動のPowerShellでDLLの読み込みに失敗する

#1

投稿記事 by inemaru » 3年前

お世話になります。

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 つが読み込めませんでした。指定されたファイルが見つかりません。"
コード側の問題かもしれませんが、
正常に、読み込む方法は無いでしょうか?

コードは、下記の通りです。
► スポイラーを表示
PowerShellは興味本位で触っている程度なので、初心者です。
プログラム全般では、C++の入門書レベルが多少わかる程度です。

bat起動ワンライナーで、動作させることを目的としているので
「C# Interactiveでやれば良い」等の開発環境を変更するような
回答は、お控え頂けると助かります。

以上、よろしくお願い致します。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#2

投稿記事 by Math » 3年前

この様な”ヒアーーストリング”によるコンパイルは(C#3)は今(C#6)では無意味です。VS2015はMicrosoftさんが長年の失敗を乗り越え遂にコンパイラの一本化に成功した初のコンパイラでありcsc.exeで全てが出来るのでこのような方法を用い無くても簡単に実現できます。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#3

投稿記事 by Math » 3年前

私のホームページhttp://csi.nisinippon.com/index.htmlをご覧ください。
またhttp://dixq.net/forum/viewtopic.php?f=3&t=18829のようにcsc.exeによるコンパイルはVisualStudioIDEと同一に(VS2015から)なりました。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#4

投稿記事 by Math » 3年前

なを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

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#5

投稿記事 by inemaru » 3年前

Math さんが書きました:この様な”ヒアーーストリング”によるコンパイルは(C#3)は今(C#6)では無意味です。VS2015はMicrosoftさんが長年の失敗を乗り越え遂にコンパイラの一本化に成功した初のコンパイラでありcsc.exeで全てが出来るのでこのような方法を用い無くても簡単に実現できます。
Math さんが書きました: 私のホームページhttp://csi.nisinippon.com/index.htmlをご覧ください。
またhttp://dixq.net/forum/viewtopic.php?f=3&t=18829のようにcsc.exeによるコンパイルはVisualStudioIDEと同一に(VS2015から)なりました。
この方法は、VS2015をインストールしていない環境や、Windows7の標準機能で使用可能な方法でしょうか。
開発は、Windows10で行いましたが、使用環境は、Windows7~Windows10にしたいと考えています。
(OSの標準機能で動かしたいので、C# Interactiveを避けていました。)

他に、
スクリプトに対する、引数の取得だったり、管理者権限まわりの動作が、
気になります。
Math さんが書きました: # アセンブリ読み込み
#Add-Type -Assembly System.Windows.Forms
は一切不要でいきなり書き出せます。VisualStudioのようにインテリセンスが働きます。
(初心者なので、間違ってるかもしれませんが)
staticメソッド等を使用する際にオブジェクトを取得してから使うのは、微妙と感じました。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#6

投稿記事 by Math » 3年前

>bat起動ワンライナーで、動作させることを目的としているので
マウス Wクリックで大丈夫です。
>(初心者なので、間違ってるかもしれませんが)
>staticメソッド等を使用する際にオブジェクトを取得してから使うのは、微妙と感じました。
間違ってる。staticメソッドを使用する際にオブジェクトを取得してから使うのではなく[クラス名]でつかう!
大抵のグロバール関数(メソッド)はそうです。
http://csi.nisinippon.com/ps--a.png
Asin,Acos・・・・staticメソッです。

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#7

投稿記事 by inemaru » 3年前

Math さんが書きました:>bat起動ワンライナーで、動作させることを目的としているので
マウス Wクリックで大丈夫です。
OS標準機能で、動けばCSIを使用しますが
配布とかするのに環境依存になるのは避けたいです。
(対象はWindows7~Windows10を想定しています)
Math さんが書きました: >staticメソッド等を使用する際にオブジェクトを取得してから使うのは、微妙と感じました。
間違ってる。staticメソッドを使用する際にオブジェクトを取得してから使うのではなく[クラス名]でつかう!
大抵のグロバール関数(メソッド)はそうです。
http://csi.nisinippon.com/ps--a.png
Asin,Acos・・・・staticメソッです。
あれ?
先ほどのレスの画像ってNew-Objectでもできるよって話じゃないんですか?
[クラス名]で使うのは、わかってるつもりです。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#8

投稿記事 by Math » 3年前

>OS標準機能で、動けばCSIを使用しますが
>配布とかするのに環境依存になるのは避けたいです。
>(対象はWindows7~Windows10を想定しています)

落ち着いてよく読むこと。中学生向きに書いたのだから。

>あれ?
>先ほどのレスの画像ってNew-Objectでもできるよって話じゃないんですか?
>[クラス名]で使うのは、わかってるつもりです。
訳の分からない質問が多い。具体的にかくこと!!!

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#9

投稿記事 by Math » 3年前

[具体論を書くこと。抽象論にしないこと。]
----------------------------------------------
ルールのテンプレートです。(皆さんこういう感じに書かれています)
[1] 質問文
 [1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : Windows, Linux等々
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々

[3] その他
 ・どの程度C言語を理解しているか
 ・ライブラリを使っている場合は何を使っているか

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#10

投稿記事 by inemaru » 3年前

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使用時とかの文言が欲しかったです。

下記参照
► スポイラーを表示
オフトピック
入れ違いになったので、質問フォーマットに関しては、この後対応します。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#11

投稿記事 by Math » 3年前

はなしが支離滅裂におもえるので質問フォーマットに主要点1点にしぼって(ゆっくり考えて)ください。(すぐの返事は無用う)そして詳し状況を書いてください。

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#12

投稿記事 by inemaru » 3年前

  1. 質問文
    1. 自分が今行いたい事は何か
      バッチ起動のPowerShell埋め込みワンライナーを使用して
      Add-TypeでC#コードを使用する際し、.Net用のDXライブラリを使用したいと思います。

      なぜ、ps1の形式をとっていないのかというと、セキュリティ設定が必要になったりし、
      使用者側に手間がかかるためです。
      batの形式に埋め込むことで、ユーザー側の手順として起動するだけで済みます。
      PowerShellは、Windows7標準なので、新たにインストールする/させる必要がない為、使用しています。
      (OSさえあれば、使用者の環境に依存しない)
    2. どのように取り組んだか(プログラムコードがある場合記載)
      Windows7~Windows10の環境で、バッチファイルにプログラムを埋め込んだ状態で起動させるために
      下記のコードを作成しました。
      ► スポイラーを表示
    3. どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
      Add-Type の ReferencedAssemblies でライブラリの読み込みに失敗している
      もしくは、読み込み自体はできているけれど、実行時にエラーしているような状況です。

      コード:

      "1" 個の引数を指定して "Run" を呼び出し中に例外が発生しました: "ファイルまたはアセンブリ 'DxLibDotNet, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。"
      
      手始めにDXライブラリのDLLを使用しただけなので、
      今後、他のDLLを読み込むことも想定しています。
    4. 今何がわからないのか、知りたいのか
      エラー原因を含め、
      Add-Type の ReferencedAssemblies で読み込みを行ったライブラリを
      C#コードの部分で正常(エラーなし)に使用する方法が知りたいです。
  2. 環境
    1. OS
      Windows 10 Pro
    2. コンパイラ名
      コンパイラ名に相当する情報かわかりませんが、
      PowerShell2.0で動作することを想定しています。
  3. その他
    1. どの程度C言語を理解しているか
      C言の理解度は、初心者以下です。
      C++は入門書レベルの内容であれば、多少理解できます。
    2. ライブラリを使っている場合は何を使っているか
      DxLibDotNet(Ver3.16f)
不明点等ありましたら、ご指摘ください。
追記します。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#13

投稿記事 by Math » 3年前

では1点主要点と思われるDxLibDotNet.dllの読み込みについて。
[Answer]
DxLibDotNet.dllはGACにおかれたReferencedAssemblies ではないのでその命令では読み込めないのは当然である。別の命令で読む事。
以上。

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#14

投稿記事 by inemaru » 3年前

ReferencedAssembliesってGAC関係なくないですか?

自作の.Net向けDLLはカレントディレクトリに配置し使用できました。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#15

投稿記事 by Math » 3年前

それなら2つのdllを同じにして実験せよ。¥!(いまいそがしのに..)

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#16

投稿記事 by Math » 3年前

もっともっと自分で考えろ。そうしたらもっと大きな間違いに気付くはず。①時間はかけてかんがえろ!

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#17

投稿記事 by inemaru » 3年前

Math さんが書きました:それなら2つのdllを同じにして実験せよ。¥!(いまいそがしのに..)
もっともっと自分で考えろ。そうしたらもっと大きな間違いに気付くはず。①時間はかけてかんがえろ!
別に、即時に回答が欲しいわけでないので、
忙しいのであれば、レスは後でも構いません。

自分で考えて解決しなかったので、質問しているのです。

あと、もっと大きな間違えを指摘してください。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#18

投稿記事 by Math » 3年前

(PowerShellでもVersion格差が大きいところ。dllを読み込む命令は現に使ってるよ。C#3なんて古い時代は命令が少なかった。それは置いといても別の大きな問題の方が...)

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#19

投稿記事 by Math » 3年前

(私のホームページにPowerShellとC#とVBについてかなり詳しく書いたはずなのでよんでみて)
http://powershell-vb-memo.nisinippon.com/

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#20

投稿記事 by Math » 3年前

このプログラムはPowerSell_iseでテストしましたか?(動きました?)

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#21

投稿記事 by Math » 3年前

このプログラムはPowerSell_iseでテストしましたか?(動きました?)

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#22

投稿記事 by inemaru » 3年前

今現在確認できた事として、
ReferencedAssembliesで自作DLLの読み込みを行えるが、
環境によっては例外が発生する。(Windows8.1環境で、呼び出した段階で例外が発生した)

dllの読み込みで、.Netのバージョンが依存となる点が問題といった感じでしょうか。

現在の方法だと問題がありそうなので方針を変更して、
C#のコードで、うまくバージョン選択して参照を追加する方法がないか調べてみます。
Math さんが書きました:(私のホームページにPowerShellとC#とVBについてかなり詳しく書いたはずなのでよんでみて)
http://powershell-vb-memo.nisinippon.com/
読んでみます。
Math さんが書きました:このプログラムはPowerSell_iseでテストしましたか?(動きました?)
ISEではテストしていませんが、動かない気がします。
(もともとISEで動作させる予定はなかった為)

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#23

投稿記事 by Math » 3年前

ふと気が付いたら”なぜC#のコンパイルに”PowerShellのAdd-Typeがいるのか?!
必要なのはDLLの参照設定だろう!!

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#24

投稿記事 by Math » 3年前

Add-Type -Path ./DxLibDotNet.dll だけでいいはずが
[DxLibDLL] クラス表示ができない!
C#で自作したらよめるのに..
---DxLibDotNet.dll  はWin32のラッパークラスのDLLだから読める訳がない..

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#25

投稿記事 by Math » 3年前

うっかりしてました。よく確かめなっかたですね。
コンパイル:/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]

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#26

投稿記事 by Math » 3年前


このヒアー・ストリングは動作しました。

コード:

$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]

inemaru
記事: 108
登録日時: 4年前

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#27

投稿記事 by inemaru » 3年前

結論としては、
「バッチ埋め込みのPowerShellでC#コードに任意のライブラリを使用する事はできない」
とします。

Assemblyのメンバを使用してできなくもなかったですが、
本来はコンパイル時の指定で事足りるはずなので不毛。

PowerShellのみで実装する場合は、動作しますが、
Add-TypeのC#コード中で任意のライブラリを使用/読み出すには制約があるようです。
(自作のDLL内で使用される.Netバージョンが指定できない為、環境によってエラーする)

結局、
inemaru さんが書きました: エラー原因を含め、
Add-Type の ReferencedAssemblies で読み込みを行ったライブラリを
C#コードの部分で正常(エラーなし)に使用する方法が知りたいです。
は、解決していませんが、
エラー原因が分かったということで
とりあえず、解決とします。

ありがとうございました。

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#28

投稿記事 by Math » 3年前

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> 

Math

Re: バッチ起動のPowerShellでDLLの読み込みに失敗する

#29

投稿記事 by Math » 3年前

[雑談]

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/

閉鎖

“C言語何でも質問掲示板” へ戻る