DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
UpDateVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(3) | NomalLIstview のDataSource(2) | NomalClassの作り方(2) | NomalOpenFileDialogの初期ファイル名の表示が変(1) | NomalVB.NETのVBA化(2) | Nomal改行のコード(7) | NomalGoogle翻訳の結果の取得(2) | NomalStopwatchクラスのElapsedMillisecondsの挙動(2) | Nomal.net Chartで二重ドーナツグラフの作り方(3) | Nomalexeをショートカットから起動した場合のエラー(2) | Nomalデスクトップ と Desktop(6) | Nomalデザイナのプロパティウィンドウで静的プロパティを選択したい(3) | NomalPHPでシリアライズした、データをデシリアライズしたい(4) | Nomal二次元配列 インデックスが配列の境界外(2) | NomalVB.netで作成したexeのNgenによる弊害(1) | NomalDrawBezierの使い方について(7) | Nomalメジャーバージョンの異なるLog4netライブラリを参照したい(4) | NomalVB6→2005変換時のDeclare宣言のマーシャリング属性(8) | NomalGROUPBOXの複製について(vb.net)(1) | NomalActiveReports 3.0からActiveReports 7.0へのァイルコンバータについて(4) | NomalAccess OLEでExecuteNonQuery(3) | NomalKeyDownでの右コントロールキーイベント(2) | NomalExcel複数シートの印刷順序(3) | NomalWMPへno(3) | NomalDataGridViewの行番号(7) | Nomalapp.config定義によるネットワークトレースログの世代管理(2) | Nomalrelease/debugのどちらで作成されたものかを判断する方法(2) | NomalC#コンソールアプリでタイピング練習ソフト作成(3) | Nomal自分自身を呼び出すのはOKですか(1) | NomalWebBrowser Control foreachで値が消える(2) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | NomalWebBrowser Controlを使って、任意の値を取得(5) | NomalEditボックスに簡体字をセットする方法(2) | NomalList型でエラーが起きてしまい・・・(1) | Nomalフォルダ内の全ての容量を取得したい(4) | NomalWebClientが上手く動かない(2) | Nomal共変性と反変性ってこういうこと?(4) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalLINQの拡張メソッドの定義(1) | Nomalこんな演算子初めて見ました。(5) | Nomalプロセスからウインドウを取得(4) | Nomalフォーム外のカーソルの変更(2) | NomalLINQのメソッド構文の書き方(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | Nomalラムダ式の勉強中(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | NomalNewの使い方間違ってますか?(4) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalC#をVBに変換(2) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalCatch時のex.StackTraceの情報(3) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalPictureBox.Locationのキャンセル(3) | NomalJOIN操作の構文エラー(4) | NomalVisualStudioでマクロ(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalRDP接続でのネットワーク帯域制限(0) | NomalFILE.COPYでIOExceptionエラーが出る(11) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalDrawImage でメモリ不足エラー(3) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalCode128でバーコードが読み取れない(8) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | NomalVC++ → VB.Netに変換時に文法エラー(2) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalVb.netからAccessへの接続について(3) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal令和の日付への対応(3) | Nomalスクロールバーが出た時に高さを変えたい(4) | Nomal自作したアプリの発行元を明記したい(2) | NomalHTTP 417エラーを発生させるためのIIS設定はどうすればよいか(3) | Nomal起動ディスプレイの指定方法について(6) | NomalSystem.Threading.Thread.Sleep()と変数(2) | NomalVisual Studio DataTableの値のアクセスの仕方(2) | NomalDatagridviewのクリア(2) | NomalDataGridView 行の背景色の設定(2) | NomalListBoxにデータが表示されない(6) | NomalPIctureBox同士を論理合成したい(3) | NomalDrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい(3) | Nomalポルトガル語の登録(5) | NomalnumericUpDwonコントロールのvalue(2) | Nomalデータセット定義ファイルからDataTable(3) | NomalDataTableの構造が同じか調べるメソッド(2) | Nomalネットの画像の複数枚を重ね合わせたい(3) |



■記事リスト / ▼下のスレッド
■34526 / 親記事)  二次元配列 インデックスが配列の境界外
□投稿者/ タサケン 一般人(1回)-(2020/09/02(Wed) 23:17:44)
  • アイコン環境/言語:[環境:Windows 10 64bit 使用言語:C# .NET Frameworkのバージョン:4.7.2] 
    分類:[.NET] 

    以下のようにプログラムしてデバッグしたら
    インデックスが配列の境界外です
    と出てしまいますどうすればいいか教えてください

          int[,] array = new int[5, 5];

    int y = array.GetLength(0);
    int timesx = 1;
    int counter = 0;
    int counter2 = 0;
    int number2 = 0;
    if(array.GetLength(1)%2==0)
    {
    number2 = 1;
    }

    for (int number = 1; number <= array.Length; number++)
    {
    for (int x = array.GetLength(1) - 1; x >= number2; x--)
    {
    counter++;

    if (counter % 2 == 1)
    {
    timesx = y * 2 - 1;
    }
    if (x == 0)
    {
    timesx = y - 1;
    }
    while (timesx > 0)
    {
    if (counter % 2 == 0)
    {
    x = -x;
    y = -(y - 1);
    }
    else
    {
    counter2++;
    if (counter2 % 2 == 1)
    {
    y = 0;
    }
    else
    {
    x = -x;
    y = 1;
    }
    if (x == 0)
    {
    y = 1;
    }
    }
    array[x, y] = number;
    if (x < 0)
    {
    x = -x;
    }
    y = array.GetLength(0);
    timesx--;
    }
    counter2 = 0;
    timesx = 1;

    }
    }
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34527 / ResNo.1)  Re[1]: 二次元配列 インデックスが配列の境界外
□投稿者/ Hongliang 大御所(585回)-(2020/09/03(Thu) 08:59:04)
  • アイコン
    例えばこの部分
    array[x, y] = number;
    if (x < 0)
    {
        x = -x;
    }
    配列の添え字が負になることはないのですから、
    xを添え字に使った後で負かどうか判定するというのは
    ロジックとしておかしいですね。
    
    まあ何がどうなるのが正解かを知らないので、
    「どうすればいいか」は私には答えられませんが。

違反を報告
引用返信
■34528 / ResNo.2)  Re[1]: 二次元配列 インデックスが配列の境界外
□投稿者/ 魔界の仮面弁士 大御所(1293回)-(2020/09/03(Thu) 08:59:35)
  • アイコンNo34526に返信(タサケンさんの記事)
    > int[,] array = new int[5, 5];
    上記により、5×5 すなわち 25要素の配列が確保されますね。
    それぞれの添字は 0〜4 の範囲となります。

     [0,0], [1,0], [2,0], [3,0], [4,0],
     [0,1], [1,1], [2,1], [3,1], [4,1],
     [0,2], [1,2], [2,2], [3,2], [4,2],
     [0,3], [1,3], [2,3], [3,3], [4,3],
     [0,4], [1,4], [2,4], [3,4], [4,4]


    > インデックスが配列の境界外です
    > と出てしまいます

    array 配列に渡している添字が
    「0≦x≦4」かつ「0≦y≦4」になっていないからです。


    > array[x, y] = number;
    に至るまでの処理を良く見直してみてください。

    最初にこの行に来た段階では、
     「x = 4」「y = 0」、「number = 0」
    となるので、問題無く代入できます。

    しかし 2 回目にここに来た時には、
     「x = -1」「y = 1」、「number = 1」
    となっているわけですから、array[x, y] へのアクセスが
    IndexOutRangeException を誘発するのは当然のことです。


    > どうすればいいか教えてください

    コードを修正してください。

    エラーが出ないようするだけなら、添字が範囲外の時には
    配列を読み書きしないようにすればエラーは出なくなります。

    しかしそれが期待する動作であるかは別問題です。
    そもそも x や y が範囲外になってしまうことが問題というのであれば、
    そこに至るまでの処理を見直す必要があるでしょう。


    いずれにせよ、x や y の取るべき範囲は 0〜4 に限られますが、
    まずはループ範囲の確認からですね。


    > for (int number = 1; number <= array.Length; number++)
    の処理は、number が 1〜25 という範囲を紡ぐことを意味します。

    > for (int x = array.GetLength(1) - 1; x >= number2; x--)
    number2 は 0 か 1 のいずれかになる想定であり、
    今回の場合は number2 が 0 と割り当てられています。
    そのため上記ループは、x が 4〜0 という範囲をとることになります。


    問題は、その x ループ内で、
    何度か「x = -x;」という表現が登場していることです。


    x が取りうる範囲は 0〜4 なのですから、正負符号を反転させることに
    合理性があるとは思えません。

    ましてや、変数 x は for のループカウンターにもなっているわけですから、
    ループ途中でカウンタの値を変更してしまうと、ループ回数の判定が
    分かりにくくなります。


    そもそもこの一連の処理で、何をさせたいのでしょうか?
    一連のコードで何を行おうとしているのか、
    処理の「意図」あるいは「目的」を知っているのは
    コードを組んだ御本人だけです。

    あるいはコードの各処理の意味を説明して頂ければ、
    第三者でも問題点を指摘できるかもしれません。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34521 / 親記事)  VB.netで作成したexeのNgenによる弊害
□投稿者/ 金ちゃん 一般人(1回)-(2020/08/05(Wed) 15:41:37)
  • アイコン環境/言語:[VB.net Oracle ODP.net] 
    分類:[.NET] 


    お世話になっております。金ちゃんと申します。

    今回VB6からVB.netにマイグレーションを行いました。
    DBはOracleでVB.netからはODP経由でDB接続していますが、
    何故かコンパイルしたexe(3Mぐらいのサイズ)にNgenをかけるとDB接続だけで1.5秒ぐらいかかってしまいます。
    逆にNgenをかけなければ0.5秒ぐらいでDB接続出来ます。
    Ngenする事でNgenなしの場合と比べて性能が劣化するパターンがあるのでしょうか?
    ※exe起動直後にDBからデータを取得しパブリック変数に値の格納をする場合にも同じような症状が発生してます。

    漠然とした質問で申し訳ありませんが、藁にもすがりたい状態で困ってます。

    よろしくお願いします。
違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■34522 / ResNo.1)  【報告】この投稿はマルチポストです
□投稿者/ (報告) 大御所(275回)-(2020/08/05(Wed) 22:45:17)
  • アイコンこの投稿はマルチポストです。もし元記事の投稿者にマルチポストの心当たりがない場合は、すぐに返信でお知らせください。

    ●マルチポストされている場所
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=95477

    ----------
    この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

    ●書き込みのルールについて
    https://dobon.net/vb/bbs/index.html
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-1]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34510 / 親記事)  DrawBezierの使い方について
□投稿者/ つばさ 一般人(1回)-(2020/07/31(Fri) 17:38:42)
  • アイコン環境/言語:[Win10 VB2017] 
    分類:[.NET] 

     はじめまして、よろしくお願いします。
    Win10でVB2017を使用しています。

    現在、ベジェ曲線をPivtureBox表示に挑戦しています。

    Dim Bezier_1 As New Point(66, 663)
    Dim Bezier_2 As New Point(96, 784)
    Dim Bezier_3 As New Point(96, 784)
    Dim Bezier_4 As New Point(236, 731)

    g.DrawBezier(Pen_Red, Bezier_1, Bezier_2, Bezier_3, Bezier_4)

    と、記述した時の描画が、添付画像になります。
    赤色ラインがVB出力ですが、実際のイラストレーターのライン(黒色ライン)と
    かなり違った結果になります。

    始点終点、制御点が2点の時は問題ないのですが
    制御点が1点の時の3点ベジェ曲線の時にこうなります。

    3点ベジェ曲線の記述方法のアドバイスを頂けたら嬉しいのですが
    よろしくお願いします。(うまく説明できてないと思いますが、すみません。)

191×140
イメージ
2020-07-31.jpg
/17KB
違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■34515 / ResNo.3)  Re[3]: DrawBezierの使い方について
□投稿者/ 魔界の仮面弁士 大御所(1290回)-(2020/08/02(Sun) 16:55:03)
  • アイコン
    No34514に返信(つばささんの記事)
    > 3点ベジェの曲線を表示するのは、座標計算をしなければ
    > 思ったような曲線は、得られないようですね。
    
    …あれ?
    
    質問内容は「DrawBezier メソッドの使い方について」であって、
    黒色ラインを描く方法についてでは無いと思ったのですが。
    
    
    曲線の細かい話については、この辺りに書かれていますが、それはさておき。
    http://www.f.waseda.jp/moriya/PUBLIC_HTML/education/classes/infomath6/applet/fractal/spline/
    
    2 次ベジエを 3 次ベジエに変換したいのであれば、2次における
    「始点〜制御点までの 2/3 の位置」と
    「終点〜制御点までの 2/3 の位置」を
    3 次の第一制御点・第二制御点として指定してみてください。
    
    
    > 実際のイラストレーターのライン(黒色ライン)と
    イラストレーター(Illustrator?)を見たことが無いので
    黒色ラインが 2 次ベジエであるという、
    当方の予想が正しいのかは分かりません。
    そちらの仕様確認はご自身で行ってください。
    
    
    
    Module GraphicsExtension
      <System.Runtime.CompilerServices.Extension>
      Public Sub DrawQuadCurve(this As Graphics, pen As Pen, pt1 As PointF, pt2 As PointF, pt3 As PointF)
        Dim p1 As New PointF((pt1.X + 2.0F * pt2.X) / 3.0F, (pt1.Y + 2.0F * pt2.Y) / 3.0F)
        Dim p2 As New PointF((2.0F * pt2.X + pt3.X) / 3.0F, (2.0F * pt2.Y + pt3.Y) / 3.0F)
        this.DrawBezier(pen, pt1, p1, p2, pt3)
      End Sub
    End Module
    
    
    とりあえず上記を貼り付けたうえで、先の
     .DrawBezier(bezierPen, points(0), points(1), points(1), points(2))
    の結果を
     .DrawQuadCurve(bezierPen, points(0), points(1), points(2))
    と比較してみてください。

違反を報告
引用返信
■34516 / ResNo.4)  Re[4]: DrawBezierの使い方について
□投稿者/ つばさ 一般人(3回)-(2020/08/03(Mon) 08:14:24)
  • アイコン説明不足にも関わらづ、追加の解説ありがとうございます。
    最初の投稿画像ですが、説明を加えたものを添付致します。
    DrawBezierの3点での使い方を検索したのですが
    4点での使い方しか無いように思い試してみると違う形の結果でした。

    そこで制御点を作ることを考えたのですが、参考ページがなかったので
    数値を変化させながら結果を重ねて表示することを繰り返しました。
    元の制御点から60%の位置が丁度イラストレーターの画像と
    一致するような結果になりました。

    いくつかテストAIデータを作って、試したのですが問題なさそうです。
     しかし「ベジェ曲線」の描画方法が、誤差を考えると
    こんなやり方のはずがないと思い質問をしました。

    たとえば
      DrawBezier(Color、始点、制御点1、制御点2、終点、描画形式)
        の、ような記述で
    描画形式(ラインの種類)を指定した場合にその指定で描画してくれるのでは?
    この答えは分かりませんでしたので、今回こちらで質問させていただきました。

    2度に渡ってわかりやすい解説、ありがとうございます。

225×206
イメージ
2020-07-30.png
/7KB
違反を報告
引用返信
■34518 / ResNo.5)  Re[5]: DrawBezierの使い方について
□投稿者/ 魔界の仮面弁士 大御所(1292回)-(2020/08/03(Mon) 15:00:00)
  • アイコンNo34516に返信(つばささんの記事)
    > DrawBezierの3点での使い方を検索したのですが
    > 4点での使い方しか無いように思い試してみると違う形の結果でした。

    ベジエ曲線の考え方は、下記のアニメーションを見ると分かりやすいかと思います。
    https://postd.cc/bezier-curves/


    なお、.NET Framework のヘルプで DrawBezier について調べてみると、
    ベジェではなくベジエと表記されているわけですが、Be'zier の発音は
    ベジェよりはベジエの方が原音に近いようです。(ベズィエといった感じ?)



    > 元の制御点から60%の位置が丁度イラストレーターの画像と
    > 一致するような結果になりました。

    2 次 → 3 次変換を、数学的証明した記事がありました。
    60% ではなく、2/3 の位置ですね。
    https://nowokay.hatenablog.com/entry/20070623/1182556929


    3 次 → 2 次はもう少し複雑です。次数を落としている分、
    1 つの 2 次ベジエで表現できるとは限らないので、
    複数の 2 次ベジエ曲線を並べて近似曲線にするなどして対応します。
    http://nutsu.com/blog/2008/021520_as_bezierconvert.html
違反を報告
引用返信
■34519 / ResNo.6)  Re[6]: DrawBezierの使い方について
□投稿者/ つばさ 一般人(4回)-(2020/08/04(Tue) 07:49:18)
  • アイコン お世話になります。
    新たな情報、ありがとうございます。

    制御点の値を3つほど作ってラインを書いてみました。
    その後、AIのラインとVBのラインを重ねての画像です。

    制御点60%でほぼ一致することから、数式から導かれるBezier曲線と
    A社、M社の3点Bezier曲線は独自のものと思われます。

    3点Bezier曲線に関しては、ユーザーが必要な係数を
    探し出しセットする仕様なのかもしれませんね?

    この問題は、最初あまり気にならなかったのですが
    これから先に進めていく過程で、座標計算にて曲線の通過ポイントを
    割り出さなければいけない場面が出てくるのですが
    今の時点で、遭遇できたことは幸いです。

    幾度もの解説、並びにアドバイスいただき感謝しています。
    ありがとうございました。

解決み!
違反を報告
引用返信
■34520 / ResNo.7)  Re[7]: DrawBezierの使い方について
□投稿者/ つばさ 一般人(5回)-(2020/08/04(Tue) 08:10:50)
  • アイコン画像が大きくて、添付できていませんね?
    もう一度、投稿です。
解決み!
158×112
イメージ
2020-08-04.jpg
/16KB
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34495 / 親記事)  メジャーバージョンの異なるLog4netライブラリを参照したい
□投稿者/ なおし 一般人(1回)-(2020/07/09(Thu) 09:55:04)
  • アイコン環境/言語:[Windows10, C#, .NET Framework 4.5.2] 
    分類:[.NET] 

    単独で実行可能なWindows Fromsアプリケーションを開発しています。
    開発にあたり、複数のライブラリを利用しているのですが、これらに異なるバージョンのLog4netライブラリを参照するものが含まれています。

    ・参照DLL:AAA.dll が、log4net の 1.2.10.0 を参照する。
    ・参照DLL:BBB.dll が、log4net の 2.0.8.0 を参照する。

    この状況で、新しいバージョンの 2.0.8.0 の log4net を参照して実行すると、

    ----------------
    System.IO.FileLoadException: ファイルまたはアセンブリ 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
    ファイル名 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821' です。'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821'
    ----------------

    とエラーとなってしまいます。
    ネットで調べて、同じような目に遭っている

    https://www.it-swarm.dev/ja/.net/%E5%90%8C%E3%81%98%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7log4net%E3%81%AE2%E3%81%A4%E3%81%AE%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B/969316636/

    を参考に、app.config を以下のように変更したものの、発生するエラーに変化がありません。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
    <dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
    <codeBase version="1.2.10.0" href="log4net.1.2.10/log4net.1.2.10.dll" />
    </dependentAssembly>
    </assemblyBinding>
    </runtime>
    </configuration>

    これらAAA.dll, BBB.dllの何れも、私共の会社で作成しているものではないため、参照先log4netのバージョンを変更してリビルド、ということが難しい状況にあり、苦慮しております。

    何か指定の仕方にあやまりがあるのでしょうか。
    お気づきのことがありましたら、ご指摘いただけると幸いです。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■34496 / ResNo.1)  Re[1]: メジャーバージョンの異なるLog4netライブラリを参照したい
□投稿者/ 魔界の仮面弁士 大御所(1285回)-(2020/07/09(Thu) 11:59:05)
  • アイコンNo34495に返信(なおしさんの記事)
    > app.config を以下のように変更したものの、

    その定義だと、dependentAssembly 要素が 1 組しかないようですね。
    1.2.10.0 向けと 2.0.8.0 向け用それぞれに
    //dependentAssembly/assemblyIdentity[@name="log4net"]
    のノードを用意してみては如何でしょう。

    https://pie001.hatenablog.com/entry/2016/12/22/100714
    https://www.it-swarm.dev/ja/.net/*/969316636/
違反を報告
引用返信
■34497 / ResNo.2)  Re[2]: メジャーバージョンの異なるLog4netライブラリを参照したい
□投稿者/ Hongliang 大御所(582回)-(2020/07/09(Thu) 13:05:55)
  • アイコンフォルダ構成はちゃんとしていますか?
    Releaseのほうだけlog4net.1.2.10\log4net.1.2.10.dllを配置してて
    Debugで実行してるとかないですか?
違反を報告
引用返信
■34498 / ResNo.3)  Re[3]: メジャーバージョンの異なるLog4netライブラリを参照したい
□投稿者/ なおし 一般人(2回)-(2020/07/10(Fri) 10:58:32)
  • アイコン魔界の仮面弁士様、Hongliang様、コメントくださいましてありがとうございます。
    まずは魔界の仮面弁士様にご指摘くださいました、両方ちゃんと指定したものの、状況変わらず同じエラーが発生しております。
    また、Hongliang様にご指摘くださいました、app.configに指定したパスと、実際のDLLファイルの配置が適切か、についてもあらためて確認しておりました、以下のように適切?に配置している状況となっておりました。

    プロジェクト
    └bin
     └Debug
      ├log4net.1.2.10
      │└log4net.1.2.10.dll
      ├log4net.dll ※v2.0.8.0 のものです。
      ├AAA.dll
      ├BBB.dll
      ├WindowsFormApplication.exe
      ├WindowsFormApplication.exe.config
      └他DLL

    この構成で、app.configの中身は以下となっています。
    (ビルドにより作成されるWindowsFormApplication.exe.configも中身同じです)

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
    <dependentAssembly>
    <assemblyIdentity name="log4net" culture="neutral" publicKeyToken="669e0ddf0bb1aa2a" />
    <codeBase version="2.0.8.0" href="log4net.dll" />
    <!-- 以下の指定をいれてもダメでした。 -->
    <!-- <bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0" /> -->
    </dependentAssembly>
    <dependentAssembly>
    <assemblyIdentity name="log4net" culture="neutral" publicKeyToken="1b44e1d426115821" />
    <codeBase version="1.2.10.0" href="log4net.1.2.10/log4net.1.2.10.dll" />
    </dependentAssembly>
    </assemblyBinding>
    </runtime>
    </configuration>


    実行に際し、VisualStudioからのデバッグ実行だけでなく、上記フォルダ内の「WindowsFormApplication.exe」を直接実行しても同じ結果となっています。

    どうも、app.configの設定を読んでくれているのか、というそもそもの疑問がわいておりまして、
    新しくWindowsFormアプリケーションを最小構成で作成して、リトライしてみます。

    取り急ぎ、お礼と現状報告までとさせてください。
    結果はまたここでご報告させていただきます。

    ありがとうございました。
違反を報告
引用返信
■34508 / ResNo.4)  Re[4]: メジャーバージョンの異なるLog4netライブラリを参照したい
□投稿者/ なおし 一般人(3回)-(2020/07/15(Wed) 17:30:23)
  • アイコン魔界の仮面弁士様、Hongliang様、ご報告が遅くなりましたが、異なるLog4netの
    バージョンを参照するDLLのみで構成したモジュールで色々切り分けたものの、
    app.config に記述するやり方では問題を回避することが出来ませんでした。

    私共のスキルでは回避できないと判断し、AAA.dll と log4net.dll(1.2.10.0)
    を別フォルダに配置し、アプリケーションドメインを別に作りその中で AAA.dll
    を読み込んで、プロキシ経由で AAA.dll の機能を利用することにしました。
    今のところ問題無いようですので、これで進めようと考えています。

    色々とご示唆いただきありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▲上のスレッド
■34499 / 親記事)  VB6→2005変換時のDeclare宣言のマーシャリング属性
□投稿者/ nao 一般人(11回)-(2020/07/13(Mon) 17:33:13)
  • アイコン環境/言語:[VB.NET、.NET Framework2.0] 
    分類:[.NET] 

    VB6.0のプロジェクトをVS2005のコンバート機能を使用して変換したのですが、以下のワーニングが出ています。

    'UPGRADE_WARNING: 構造体 FileTime に、この Declare ステートメントの引数としてマーシャリング属性を渡す必要があります。
    Public Declare Function LocalFileTimeToFileTime Lib "KERNEL32.DLL" (ByRef lpLocalFileTime As FileTime, ByRef lpFileTime As FileTime) As Integer

    なお、FileTime構造体は以下の通りです。

    'FileTime構造体
    Public Structure FileTime
      Dim LowDateTime As Integer
      Dim HighDateTime As Integer
    End Structure

    Declare宣言時に引数の型に構造体を定義するときの属性は何を渡せばよいのでしょうか?
    それとも構造体のメンバの方に属性を追加するのでしょうか?

    ご存知の方がいらっしゃいましたら、ご教示いただけると幸いです。

違反を報告
引用返信

▽[全レス8件(ResNo.4-8 表示)]
■34503 / ResNo.4)  Re[2]: VB6→2005変換時のDeclare宣言のマーシャリング属性
□投稿者/ nao 一般人(14回)-(2020/07/13(Mon) 19:39:19)
  • アイコンNo34502に返信(Hongliangさんの記事)
    > おそらくその警告は、Declare文中にByRefで構造体を渡しているところ全部に自動的に付けられるものかと思います。
    > 提示されているLocalFileTimeToFileTime関数のDeclare文については、特に問題さそうです。
    > (他の関数のDeclare文で出ている箇所がある場合、それが問題ないかは個別の話になります)
    >


    ご回答ありがとうございます。

    問題があるかないかの判断はどのように考えればよろしいのでしょうか?
    他にもいくつか同じワーニングが表示されている場所があります。
    さすがに全部ここで質問するわけにもいきませんので、判断の基準がありましたらご教示いただけませんでしょうか。

違反を報告
引用返信
■34504 / ResNo.5)  Re[3]: VB6→2005変換時のDeclare宣言のマーシャリング属性
□投稿者/ Hongliang 大御所(584回)-(2020/07/13(Mon) 20:04:45)
  • アイコン> 問題があるかないかの判断はどのように考えればよろしいのでしょうか?
    > 他にもいくつか同じワーニングが表示されている場所があります。
    > さすがに全部ここで質問するわけにもいきませんので、判断の基準がありましたらご教示いただけませんでしょうか。

    特に怪しいところ、という意味では、構造体内に配列や文字列型が含まれている部分と言えますが、
    結局はすべてを1つ1つ、構造体の定義も含めたAPI定義を正しくVBに翻訳できているか確認していくことになります。
    https://docs.microsoft.com/ja-jp/dotnet/framework/interop/marshaling-classes-structures-and-unions
    一応公式ドキュメントはこの辺りです。
    // 初心者の方に対して無茶ぶりが過ぎるだろうとは思います。

    結構な数のWindows APIについては、以下のサイトにサンプル定義が載っています。
    https://www.pinvoke.net/
    Declareの代わりに<DllImport>構文だったり、C#による定義しかなかったり、といったものも多いですが。
違反を報告
引用返信
■34505 / ResNo.6)  Re[4]: VB6→2005変換時のDeclare宣言のマーシャリング属性
□投稿者/ nao 一般人(15回)-(2020/07/13(Mon) 20:11:52)
  • アイコンNo34504に返信(Hongliangさんの記事)

    ご回答ありがとうございます。
    ご教示いただいたページを読んでみたいと思います。
    ありがとうございました。
違反を報告
引用返信
■34506 / ResNo.7)  Re[5]: VB6→2005変換時のDeclare宣言のマーシャリング属性
□投稿者/ 魔界の仮面弁士 大御所(1286回)-(2020/07/14(Tue) 05:11:36)
  • アイコン2020/07/14(Tue) 09:09:11 編集(投稿者)

    No34501に返信(naoさんの記事)
    > Option Strict Offになっていますし、

    API を使うなら、できるだけ Option Strict On で動作するようコーディングされることをお奨めします。


    No34499に返信(naoさんの記事)
    > なお、FileTime構造体は以下の通りです。

    実は自前で宣言しなくても、.NET Framework には
    System.Runtime.InteropServices.ComTypes.FILETIME
    という構造体が既に用意されていたりします。


    > 'UPGRADE_WARNING: 構造体 FileTime に、この Declare ステートメントの引数としてマーシャリング属性を渡す必要があります。
    Google ってみたところ、英語版の VS2005 だと、
     'UPGRADE_WARNING: Structure FileTime may require marshalling attributes to be passed as an argument in this Declare statement. Click for more: 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="C429C3A5-5D47-4CD9-8F51-74A1616405DC"'
    になり、VS2003 の場合は、
     'UPGRADE_WARNING: Structure FileTime may require marshalling attributes to be passed as an argument in this Declare statement. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1050"'
    というメッセージになるらしいです。

    手元に ms-help プロトコルを開ける環境が残っていないので未確認ですが、「Visual Studio 2005」と共に
    「Visual Studio 2005 MSDN Library」をインストールしてあればリンクを開けるかもしれません。
    (リンクを開けたとしても、有益な情報を得られない可能性は高そうですが)


    上記リンクについて、何か情報が無いか探してみたのですが、見つかったのはこれぐらい。
    https://www.mobilize.net/vbtonet/ewis/ewi1050
    それっぽいことが書かれているものの、VB6 なのにユーザー定義型を ByRef ではなく ByVal 渡ししている時点で、資料として不自然ですね。

    あとは下記がヒットしました。
    37 ページ目の「3.5.2 Structure may require Marshalling Attributes to be passed as an Argument in this Declare Statement.」の項。

    今回の LocalFileTimeToFileTime のための有益な情報にはなるかどうかは別として、一応参考までに。
    https://www.cs.kau.se/cs/education/courses/davcdiss/Exjobb_2008/C2008-06.pdf



    > Declare宣言時に引数の型に構造体を定義するときの属性は何を渡せばよいのでしょうか?
    > それとも構造体のメンバの方に属性を追加するのでしょうか?

    Hongliang さんご提示の pinvoke.net は私もたびたび参考にさせてもらっていますが、今回の
    LocalFileTimeToFileTime API の宣言は掲載されていないみたいですね。
    FileTimeToLocalFileTime API の宣言は掲載されているのですけれども。

    すでに示されているように、今回の宣言は、自動変換された宣言のままで動くと思います。
    もしあえて修正するとすれば、In 属性および Out 属性を明示して
     ' Imports System.Runtime.InteropServices
     Public Declare Function LocalFileTimeToFileTime Lib "KERNEL32.DLL" (<[In]> ByRef lpLocalFileTime As FileTime, <Out> ByRef lpFileTime As FileTime) As <MarshalAs(UnmanagedType.Bool)> Boolean
     Public Declare Function FileTimeToLocalFileTime Lib "KERNEL32.DLL" (<[In]> ByRef lpFileTime As FileTime, <Out> ByRef lpLocalFileTime As FileTime) As <MarshalAs(UnmanagedType.Bool)> Boolean
    のようにすると良いのではないでしょうか。
    元の Win32 API の戻り値が「BOOL 型」であるため、上記では戻り値も As Boolean に変更してあります。


    No34503に返信(naoさんの記事)
    >>おそらくその警告は、Declare文中にByRefで構造体を渡しているところ全部に自動的に付けられるものかと思います。
    >>提示されているLocalFileTimeToFileTime関数のDeclare文については、特に問題さそうです。
    > 問題があるかないかの判断はどのように考えればよろしいのでしょうか?

    配列や文字列型以外の注意点として思いつくのは、StructLayout 属性の付与とか。

    例えば SHFILEOPSTRUCT 構造体は、StructLayout 属性で Pack:=1 を指定しておかないと、
    fAnyOperationsAborted 以降のメンバー位置がズレてしまうことになります。

    冗長なので、既定の設定のままで問題が無い場合は、属性指定を省略することも多いですが、
    余裕があれば StructLayout 属性にて、CharSet と Pack、時には Size も明示しておいた方が良いと思います。


    その他、個別判断が必要な例としては、 KB161301 の WindowFromPoint API が挙げられます。

    この API の本来の定義は『HWND WindowFromPoint( POINT Point );』なのですが、VB6 の制限により、
    多くの場合、引数定義を (ByVal xPoint As Long, ByVal yPoint As Long) に置き換えて代用されています。
    また、VBA7 でいうところの As LongPtr 型がまだ使えないので、戻り値が As Long で代用されているわけですが、
    これらそれぞれの「As Long」を、.NET の As Integer と As IntPtr に再翻訳する作業は、
    アップグレード ウィザードの自動変換だけではまかないきれないでしょう。
違反を報告
引用返信
■34507 / ResNo.8)  Re[6]: VB6→2005変換時のDeclare宣言のマーシャリング属性
□投稿者/ nao 一般人(16回)-(2020/07/14(Tue) 19:59:13)
  • アイコンNo34506に返信(魔界の仮面弁士さんの記事)
    > 2020/07/14(Tue) 09:09:11 編集(投稿者)
    ご回答ありがとうございます。

    色々調べてくださって、ありがとうございます。

    やはり特定の判断基準はないのですね。
    ご教示いただいたページを見ながら修正を検討してみます。
    ありがとうございました。

違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-8]






Mode/  Pass/


- Child Tree -

2020/12/02(Wed) 13:39:24 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする