C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 | 2 | 3 >>
■85811  Re[4]: 指数表記する方法
□投稿者/ 魔界の仮面弁士 -(2017/11/26(Sun) 19:36:47)
    No85807 (ちゃんころ さん) に返信
    > Public Const diele As Single = 8.85418782E-12#
    > というのが
    > Public Const diele As Single = 0.00000000000885418782
    > というのに変わってしまいます。
    
    VB のエディタは、極力、小数表記で記述しようとするためです。
    その境目となるのは、おそらく指数部の桁数でしょう。
    
    Double 型リテラルの場合、E+14〜E-16 の範囲は小数表記、その範囲外が指数表記になり、
    Single 型リテラルの場合、E+6〜E-8 の範囲が小数表記、その範囲外が指数表記になります。
    Decimal 型リテラルはの場合は、すべて小数表記にフォーマットされます。
    
    
    > どうすれば良いですか?
    
    今回の「8.85418782E-12」という表現からして、有効桁数 9 桁の値を表現したいようですが、
    Hongliang さんから指摘のあるとおり、Single 型ではこの精度の値を扱うことはそもそも出来ません。
    どう修正すべきかは、求める要件によって変わりますが、有効桁数 9 桁が本当に必要なら、
    As Double にするか、As Decimal にする必要があるでしょう。
    
    より正確に言えば、
    Double 型の仮数部の幅は、53+1ビット≒15.95 桁分であるのに対し、
    Single 型の仮数部の幅は、23+1ビット≒7.225 桁分しかないということです。
    ちなみに Decimal 型の場合は 96 ビット幅なので、約 28.89888 桁です。
    
    有効桁数 9 桁の値を Single 型で管理するには有効桁数が不足してしまい、
    どうあっても、格納時には近似値に丸められることになるでしょう。
    
    確認のため、「8.85418782E-12」相当の近似値を Single 型で表現してみましょうか。
    先に言っておくと、誤差が最小になるのは 3 番です。
    
    《Single のバイナリ表現》
    1: 0b00101101000110111100001110110110
    2: 0b00101101000110111100001110110111
    3: 0b00101101000110111100001110111000
    4: 0b00101101000110111100001110111001
    5: 0b00101101000110111100001110111010
    
    《上記を 10進小数で表現した値》
    1: 0.00000000000885418648122193729932405403815209865570068359375
    2: 0.000000000008854187348583675287727601244114339351654052734375
    3: 0.000000000008854188215945413276131148450076580047607421875
    4: 0.000000000008854189083307151264534695656038820743560791015625
    5: 0.00000000000885418995066888925293824286200106143951416015625
    
    
    ちなみに上記を diele.ToString("R") でラウンドトリップ出力した場合、
    1: 8.85418648E-12
    2: 8.854187E-12
    3: 8.854188E-12
    4: 8.854189E-12
    5: 8.85419E-12
    となります。
    
    いずれも E-8 を下回る指数表現であるため、この場合は自動変換が起こりません。
     Public Const Sample1 As Single = 8.85418648E-12F
     Public Const Sample2 As Single = 8.854187E-12F
     Public Const Sample3 As Single = 8.854188E-12F
     Public Const Sample4 As Single = 8.854189E-12F
     Public Const Sample5 As Single = 8.85419E-12F
    
    もともと扱おうとしていた「8.85418782E-12F」という値は、
    2 番と 3 番の間になり、Single の精度では表現しきれません。
    そのため、より近い値である 3 番の表記に変換されたということです。
    (有効桁数ってそういうものですよね)
    
    
    > Doubleでも試してみたのですが
    
    同様に、「8.85418782E-12」の Double 値による近似値表現を見てみます。
    こちらの場合は、3 番が同一値となります。(格納誤差はありません)
    
    
    《Double のバイナリ表現》
    1: 0b0011110110100011011110000111011011110001011001000110011010111010
    2: 0b0011110110100011011110000111011011110001011001000110011010111011
    3: 0b0011110110100011011110000111011011110001011001000110011010111100
    4: 0b0011110110100011011110000111011011110001011001000110011010111101
    5: 0b0011110110100011011110000111011011110001011001000110011010111110
    
    《上記を 10進小数で表現した値》
    1: 0.0000000000088541878199999971451928483766392647021092887626991796423681080341339111328125
    2: 0.00000000000885418781999999876077998226927144218532939046184537801309488713741302490234375
    3: 0.000000000008854187820000000376367116161903619668549492160991576383821666240692138671875
    4: 0.00000000000885418782000000199195425005453579715176959386013777475454844534397125244140625
    5: 0.0000000000088541878200000036075413839471679746349896955592839731252752244472503662109375
    
    《R 書式によるラウンドトリップ出力》
    1: 8.8541878199999971E-12
    2: 8.8541878199999988E-12
    3: 8.85418782E-12
    4: 8.854187820000002E-12
    5: 8.8541878200000036E-12
    
    
    そして先述した通り、Double 型で E-12 の範囲は小数表記されるため、
     Public Const Sample1 As Double = 8.8541878199999971E-12R
     Public Const Sample2 As Double = 8.8541878199999988E-12R
     Public Const Sample3 As Double = 8.85418782E-12R
     Public Const Sample4 As Double = 8.854187820000002E-12R
     Public Const Sample5 As Double = 8.8541878200000036E-12R
    と書いても
     Public Const Sample1 As Double = 0.0000000000088541878199999971R
     Public Const Sample2 As Double = 0.0000000000088541878199999988R
     Public Const Sample3 As Double = 0.00000000000885418782R
     Public Const Sample4 As Double = 0.000000000008854187820000002R
     Public Const Sample5 As Double = 0.0000000000088541878200000036R
    に変換される結果になりますね。
記事No.85804 のレス /過去ログ147より / 関連記事表示
削除チェック/

■87343  Re[2]: Webbrowserコントロールにつきまして
□投稿者/ 魔界の仮面弁士 -(2018/05/14(Mon) 11:12:18)
    No87334 (ak さん) に返信
    > webBrowserコントロールでurl https://www.msn.com/ja-jpを起動しますと頭から
    > タグ(window._perfMarker ・・・)が表示されます。タグが文字列として取得された為、また
    > タグを表示させない為にはurl側でwebBrowserに合ったソースで記載しなければいけないものかと
    > 推測しています。

    そのページのドコを取得したいのでしょうか?
    もしもリンクを拾いたいだけなら、こんな感じで得られそうです。

    Private Sub Command1_Click()
      Dim link As Object, l As Long
      l = 0
      For Each link In WebBrowser1.Document.links
        l = l + 1
        Debug.Print l, link.innerText
        Debug.Print , link.href
        Debug.Print
      Next
    End Sub



    > テキスト形式で実行
    > 質問
    > タグが表示される理由及びタグを非表示にする方法がありましたら、ご指導のほどよろしくお願いいたします。

    『テキスト形式で実行』の意味が良く分かりませんが、とりあえず思いつく限りで。

    Option Explicit

    Private Sub Form_Load()
      WebBrowser1.Silent = True
      WebBrowser1.Navigate "https://www.msn.com/ja-jp"
    End Sub

    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    ''''画面に表示されているテキストが取得できれば良い場合
      'body 要素を選択状態にして、クリップボード経由で取得
      WebBrowser1.Document.body.focus
      WebBrowser1.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT
      WebBrowser1.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT
      Text1.Text = Clipboard.GetText(vbCFText)
      Clipboard.Clear

    ''''選択範囲のタグやテキストを得る場合
      Dim selection As Object
      Set selection = WebBrowser1.Document.selection
      If selection.type = "Text" Then 'type プロパティは "Text", "Control", "None" のいずれか
        Dim range As Object
        Set range = WebBrowser1.Document.selection.createRange()
        Text2.Text = range.htmlText
        Text3.Text = range.Text
      End If

      '選択範囲を解除
      WebBrowser1.ExecWB OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DODEFAULT

    ''''Body 要素の中身を、テキストだけ取得したい場合
      Text4.Text = WebBrowser1.Document.body.innerText
      
    ''''Body 要素のタグごと取得したい場合
      Text5.Text = WebBrowser1.Document.body.outerHTML
      
    ''''ページ内のすべてのタグを対象にする場合は、documentElement プロパティでルートノードを得て、
    ''''そこから innerText , innerHTML, outerText, outerHTML などで取得することもできる。
    ''''ただし TextBox だと文字数制限があるので、長いコンテンツの場合はRichTextBox を使ったほうがよい
      RichTextBox1.Text = WebBrowser1.Document.documentElement.outerHTML

    ''''上記をクリップボードに直接セットする場合
      Clipboard.Clear
      Clipboard.SetText WebBrowser1.Document.documentElement.outerHTML, vbCFText

    ''''outerHTML 等だと、HTML の解析結果がロードされることになるため、
    ''''空白や改行、タグの大文字小文字、"<br>" と "<br />" の違いは失われるし、
    ''''<script> 等で動的に生成されたコンテンツも含まれることになる。
    ''''もしも、サーバーから返される生の HTML をそのまま受け取りたい場合には
    ''''IPersistStreamInit もしくは IPersistFile を使った方が良いが、
    ''''そのためには追加の参照設定が必要になってしまう。
    ''
    '  Dim pf As IPersistFile
    '  Set pf = WebBrowser1.Document
    '  pf.Save "C:\temp\example.html", True
    '
    ''
    '  Dim ps As IPersistStreamInit
    '  Set ps = WebBrowser1.Document
    '  Dim stm As ADODB.Stream
    '  Set stm = New ADODB.Stream
    '  stm.Type = adTypeBinary
    '  stm.Open
    '  ps.save stm, True
    '  stm.Flush
    '  stm.position = 0
    '  stm.Type = adTypeText
    '  stm.Charset = "_autodetect" '文字コード自動判別
    '  RichTextBox2.Text = stm.ReadText(adReadAll)
    '  stm.Close
    '
    ''''追加の参照設定なしで IPersistFile を呼び出してみた場合のサンプル
    '  http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200310/03100017.txt
    End Sub
記事No.87334 のレス /過去ログ150より / 関連記事表示
削除チェック/

■87806  Re[1]: 1なら0、0なら1を返す関数
□投稿者/ 魔界の仮面弁士 -(2018/07/01(Sun) 19:37:33)
    No87802 (ヤンゴン さん) に返信
    > integerの引数を受け取って、
    ということは、VB.NET でしょうか?
    [.NET 全般]が選択されているという事は、Office VBA 等でも無いでしょうし。
    
    
    > Not関数が使えるかと思ったのですが
    VB だとしたら、Not は関数では無く演算子です。
    整数型に対する Not 演算は、各ビットの 1 と 0 を反転させます。
    
    
    > なぜか、-2と-1という結果になるのですが・・・
    VB.NET の Integer 型だとすると、
    「Not 0」は -1 で、「Not 1」は -2 です。
    「Not -1」は 0 で、「Not -2」は 1 です。
    
    
    ・10 進数の「0」= 2 進数の「00000000000000000000000000000000」= 16 進数の「00000000」
    ・10 進数.「-1」= 2 進数の「11111111111111111111111111111111」= 16 進数の「FFFFFFFF」
    
    ・10 進数の「1」= 2 進数の「00000000000000000000000000000001」= 16 進数の「00000001」
    ・10 進数.「-2」= 2 進数の「11111111111111111111111111111110」= 16 進数の「FFFFFFFE」
    
    ・10 進数の「2」= 2 進数の「00000000000000000000000000000010」= 16 進数の「00000002」
    ・10 進数.「-3」= 2 進数の「11111111111111111111111111111101」= 16 進数の「FFFFFFFD」
    
    ・10 進数.「15」= 2 進数の「00000000000000000000000000001111」= 16 進数の「0000000F」
    ・10 進数「-16」= 2 進数の「11111111111111111111111111110000」= 16 進数の「FFFFFFF0」
    
    ・10 進数.「16」= 2 進数の「00000000000000000000000000010000」= 16 進数の「00000010」
    ・10 進数「-17」= 2 進数の「11111111111111111111111111101111」= 16 進数の「FFFFFFEF」
    
    ・10 進数.「99」= 2 進数の「00000000000000000000000001100010」= 16 進数の「00000062」
    ・10 進数「-99」= 2 進数の「11111111111111111111111110011101」= 16 進数の「FFFFFF9D」
記事No.87802 のレス /過去ログ151より / 関連記事表示
削除チェック/

■87953  Re[1]: 有効数字で切り上げるには?
□投稿者/ 魔界の仮面弁士 -(2018/07/19(Thu) 11:01:33)
    2018/07/19(Thu) 11:02:59 編集(投稿者)

    No87949 (なっとう さん) に返信
    >> 99.000000000001 → 100
    > 仰る通りです。

    出力時の有効桁数が 2 桁だとして、
    入力値 n のデータ型は何が利用されるのでしょうか?

    float 型だと、精度が 23+1 bit なので、10進数での最大有効桁数は約 7.22472 桁。
    double 型だと、精度が 52+1 bit なので、10進数での最大有効桁数は約 15.9546 桁。
    decimal 型だと、精度が 96 bit なので、10進数での最大有効桁数は約 28.8989 桁。


    今回の要件だと、出力時の値が Int32 で表される範囲なので、
    どれを選んでも十分に思えるかもしれませんが、それでも
    入力値の有効桁数というのは重要かと思います。
    (入力値の有効桁数が 28 桁以下なら、Decimal を利用するのがお奨め)


    たとえば、例示された「99.000000000001」の場合、有効桁数が 14 桁なので、
    float(Single)だと精度不足に陥ります。具体的には、小数部が近似値に丸められるので、
    float で表すと 0b0_10000101_10001100000000000000000
    double で表すと 0b0_10000000101_1000110000000000000000000000000000000000000001000110
    に相当する内部表現バイナリで保持されます。("0b" は C#7.0 で導入された 2進数リテラル表記法)

    そして上記の 2 進小数を 10 進数に変換してみると
    前者は整数 99 を表していることになりますので、100 への切り上げを行えなくなります。
    後者は小数 99.000000000000994759830064140260219573974609375 相当なので大丈夫なのですが。

    var f = 99.000000000001F; // float f = 99; と同義。
    var d = 99.000000000001D; // double d = 99.000000000001; と同義。
    var m = 99.000000000001M; // decimal m = 99.000000000001M; と同義。
記事No.87947 のレス / END /過去ログ151より / 関連記事表示
削除チェック/

■89179  Re[1]: stringクラス文字列を文字数で区切りたい
□投稿者/ 魔界の仮面弁士 -(2018/11/05(Mon) 11:55:29)
    No89171 (ビキナー さん) に返信
    > 例(3ビットで区切りたい):
    > string str = "123456789012";

    『3 ビット』で区切るの意味にもよりますが、
    "123……" という文字列を 3bit で区切ると
    → 16進数では: 31,32,33,……
    → 2 進数では: 00110001,00110010,00110011,……
    → 3 bit 区切: 001,100,010,011,001,000,110,011,……
    になりますね。


    > stringクラスで宣言した文字列を、文字数で区切る良い方法はないでしょうか?

    「3 ビット」なのか「3 文字」なのか「3 バイト」なのかで変わってきますが、
    > str2[0] = "123"
    > str2[1] = "456"
    という結果を得たいのであれば、Jitta さんや Azulean さんの回答を参考に
     str2[0] = str.substr(0u, 3u);
     str2[1] = str.substr(3u, 3u);
     str2[2] = str.substr(6u, 3u);
     str2[3] = str.substr(9u, 3u);
    になるように切り出していけると思います。
    ただし、マルチバイト文字は含まれないという前提で。


    using namespace std;

    size_t chunkSize = 3u;

    size_t const limitIndex = 10u;
    string str = "123456789012";
    string str2[limitIndex];

    size_t maxIndex = (size_t)ceil(str.length() / (double)chunkSize);
    if (limitIndex < maxIndex) { maxIndex = limitIndex; }
    for (size_t i = 0u; i < maxIndex; i++) { str2[i] = str.substr(i * chunkSize, chunkSize); }
記事No.89171 のレス /過去ログ153より / 関連記事表示
削除チェック/

■91412  イメージデータをマルチスレッドで取得する
□投稿者/ 禿げ -(2019/06/22(Sat) 11:25:14)

    分類:[.NET 全般] 

    複数のPNG画像からイメージをマルチスレッドで取得したいのですが、

    Dim ParallelOpt As New ParallelOptions() With {.MaxDegreeOfParallelism = -1}

    Parallel.For(0, 10001, ParallelOpt,
    Sub(i As Integer)


    Dim bmp1 As New Bitmap(filepath(i))


    bmp1.Dispose()
    bmp1 = Nothing


    End Sub)

    のようにすると、毎回ではないのですが、
    たまに、
    Dim bmp1 As New Bitmap(filepath(i))
    のところで、

    型 'System.OutOfMemoryException' の例外が System.Drawing.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした

    追加情報:メモリが不足しています。

    となって、プログラムが落ちてしまいます。

    コア数が10、スレッド数が20のCore i7 extremeを使用しているのですが、

    .MaxDegreeOfParallelism = -1
    のところを10とか5に下げると
    エラーとなる頻度はかなり落ちます。
    しかしそれでもたまにはやはりメモリ不足となってしまいます。

    画像ファイルのサイズは
    300x300 pixel程度で小さなファイルです。

    メモリは32 GB積んでおり、タスクマネージャーを見ても
    使用量は4 GB程度となっており、メモリは十分あります。

    更に、プログラムはAny CPUで作成しており、64 bitで動作しているので、
    2 GBの縛りもありません。

    一体、なぜこのようなエラーが生じるのでしょうか?
親記事 /過去ログ157より / 関連記事表示
削除チェック/

■91736  Re[4]: 長い桁数の定数を使用する方法
□投稿者/ 魔界の仮面弁士 -(2019/07/26(Fri) 14:28:09)
    No91732 (kozue さん) に返信
    > 3.1415926535897931
    ついでに Double の近似値についても。

    上記は 0b0_10000000000_1001001000011111101101010100010001000010110100011000 であり、

    = (2^1 +2^0 +2^-3 +2^-6 +2^-11 +2^-12 +2^-13 +2^-14 +2^-15
    +2^-16 +2^-17 +2^-20 +2^-21 +2^-22 +2^-23 +2^-26 +2^-28
    +2^-33 +2^-37 +2^-38 +2^-40 +2^-41 +2^-45 +2^-46 +2^-51)

    相当なので、そのまま復元すると、
     3.141595740000000080982545114238746464252471923828125
    に相当します。


    内部バイナリを 1 bit ずつずらして近似値を作ると
     -2: 0b0_10000000000_1001001000011111101101010100010001000010110100010110
     -1: 0b0_10000000000_1001001000011111101101010100010001000010110100010111
     =0: 0b0_10000000000_1001001000011111101101010100010001000010110100011000
     +1: 0b0_10000000000_1001001000011111101101010100010001000010110100011001
     +2: 0b0_10000000000_1001001000011111101101010100010001000010110100011010
    になるので、これを 10 進小数に戻すと
     -2: 3.14159265358979222781954376841895282268524169921875
     -1: 3.141592653589792671908753618481568992137908935546875
     =0: 3.141592653589793115997963468544185161590576171875
     +1: 3.141592653589793560087173318606801331043243408203125
     +2: 3.14159265358979400417638316866941750049591064453125
    になります。

    なので、実運用上の表現形式では
     =0: 3.1415926535897931
    の桁数まで表現すれば、前後の近似値と区別できますね。
記事No.91729 のレス /過去ログ158より / 関連記事表示
削除チェック/

■96994  Re[9]: 数値書式指定文字列からの変換
□投稿者/ 魔界の仮面弁士 -(2021/03/11(Thu) 12:32:48)
    No96991 (ゆい さん) に返信
    >>Dim d As Single = CSng("4.2444972e-07")
    >>Dim s1 As String = d.ToString("N20")
    >>t(0) = CSng(s1)
    > このようにしても t(0)の値は4.244497E-07にはなりませんか?
    > "0.00000042444970000000"にしたいのです。
    
    デバッガで見えている表現は、先の R 書式相当の見え方です。
    
    そもそも Single 型では「0.00000042444970000000」と
    完全に一致する値を作り出すことができません。Decimal なら可能ですが。
    
    Single にとって、4.244497E-07 というのはあくまで近似値であり、実際には
     0.00000042444970000000
    ではなく、内部的にはそれよりもほんの少し小さな
     0.0000004244496949468157254159450531005859375
    に相当する値となります。
    
    
    Single 型の内部バイナリ表現            画面上の表示例   バイナリ表現を精度桁で打ち切らず算出した結果
    ------------------------------------   --------------   --------------------------------------------
    [0 01101001 11000111101111111101011]   4.24449667E-07   4.24449666525106295011937618255615234375e-7
    [0 01101001 11000111101111111101100]   4.244497E-07     4.244496949468157254159450531005859375e-7
    [0 01101001 11000111101111111101101]   4.24449723E-07   4.24449723368525155819952487945556640625e-7
記事No.96979 のレス /過去ログ168より / 関連記事表示
削除チェック/

■100014  C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ ぱんだ -(2022/06/29(Wed) 15:10:12)

    分類:[.NET 全般] 

    c#で作ったDLLをvb.netで使おうとすると、【BC30652:型[object]を含むアセンブリ['〜']への参照が必要です。参照をプロジェクトへ追加してください。】というエラーが出ます。
    参照の追加はしていて参照のところにも表示されているのですが、呼び出し方のミスでしょうか?
    かなり初歩的な部分で調べて色々とやっているのですが原因がわかりません。
    C#に組み込むことはできたのですが、vb.netの経験が浅く初歩的な部分で進まなくなってしまったので質問させていただきました。

    ■DLL(c#)
    クラス名 aaa
    メソッド名 bbb(stringを受け取りstringを返す)

    ■呼び出し元(vb.net)
    Imports DLL名

    Dim 変数 As String = aaa.bbb("stringパラメータ")

    と記述しています。




親記事 /過去ログ174より / 関連記事表示
削除チェック/

■100015  Re[1]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ radian -(2022/06/29(Wed) 15:29:36)
    2022/06/29(Wed) 15:35:38 編集(投稿者)

    No100014 (ぱんだ さん) に返信
    > c#で作ったDLLをvb.netで使おうとすると、【BC30652:型[object]を含むアセンブリ['〜']への参照が必要です。参照をプロジェクトへ追加してください。】というエラーが出ます。
    > 参照の追加はしていて参照のところにも表示されているのですが、呼び出し方のミスでしょうか?
    > (中略)
    > ■呼び出し元(vb.net)
    > Imports DLL名

    Importsには、DLL名ではなく、使用したいクラスを含む名前空間名を指定します。
    プロジェクトにDLLの参照を既に追加しているなら、
    ソリューションエクスプローラーの「参照」の所にある
    追加したDLLをダブルクリックすると、
    オブジェクトブラウザで、DLLに含まれる名前空間やクラスの一覧が確認出来ます。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100016  Re[2]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ ぱんだ -(2022/06/29(Wed) 15:35:20)
    No100015 (radian さん) に返信

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

    > Importsには、DLL名ではなく、使用したいクラスを含む名前空間名を指定します。
    > プロジェクトにDLLの参照を既に追加しているなら、その名前をダブルクリックすると、
    > オブジェクトブラウザで、DLLに含まれる名前空間やクラスの一覧が確認出来ます。

    DLL名と書いてしまいましたが、DLL名と名前空間名が同じになります。
    オブジェクトブラウザで、名前空間やクラスの確認はできました。

記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100017  Re[3]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ radian -(2022/06/29(Wed) 15:40:27)
    2022/06/29(Wed) 15:44:07 編集(投稿者)

    No100016 (ぱんだ さん) に返信
    > ■No100015 (radian さん) に返信
    >
    > ご回答ありがとうございます。
    >
    >>Importsには、DLL名ではなく、使用したいクラスを含む名前空間名を指定します。
    >>プロジェクトにDLLの参照を既に追加しているなら、その名前をダブルクリックすると、
    >>オブジェクトブラウザで、DLLに含まれる名前空間やクラスの一覧が確認出来ます。
    >
    > DLL名と書いてしまいましたが、DLL名と名前空間名が同じになります。
    > オブジェクトブラウザで、名前空間やクラスの確認はできました。

    もしC#で作成したDLLが別のアセンブリに依存しているのであれば、
    それも参照に追加してみてください。

    > c#で作ったDLLをvb.netで使おうとすると、【BC30652:型[object]を含むアセンブリ['〜']への参照が必要です。参照をプロジェクトへ追加してください。】というエラーが出ます。

    で、名前が伏せられているので詳細は判りませんが、
    そのエラーメッセージに参照しているアセンブリ名が表示されている筈です。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100018  Re[4]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ ぱんだ -(2022/06/29(Wed) 15:50:46)
    No100017 (radian さん) に返信

    >>c#で作ったDLLをvb.netで使おうとすると、【BC30652:型[object]を含むアセンブリ['〜']への参照が必要です。参照をプロジェクトへ追加してください。】というエラーが出ます。
    >
    > で、名前が伏せられているので判りませんんが、そのエラーメッセージに参照しているアセンブリ名が表示されている筈です。

    エラー内容を端折ってしまいすみません。
    BC30652 型 '[Object]' を含むアセンブリ 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' への参照が必要です。参照をプロジェクトに追加してください。
    と出ています。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100020  Re[5]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ radian -(2022/06/29(Wed) 16:03:08)
    2022/06/29(Wed) 16:04:09 編集(投稿者)

    No100018 (ぱんだ さん) に返信
    > ■No100017 (radian さん) に返信
    >
    > >>c#で作ったDLLをvb.netで使おうとすると、【BC30652:型[object]を含むアセンブリ['〜']への参照が必要です。参照をプロジェクトへ追加してください。】というエラーが出ます。
    >>
    >>で、名前が伏せられているので判りませんんが、そのエラーメッセージに参照しているアセンブリ名が表示されている筈です。
    >
    > エラー内容を端折ってしまいすみません。
    > BC30652 型 '[Object]' を含むアセンブリ 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' への参照が必要です。参照をプロジェクトに追加してください。
    > と出ています。
    >

    何となく、プロジェクトの.NETフレームワークのバージョンが噛み合ってない気が。
    例えば、.NET Framework 4.x系と.NET5〜6のライブラリは互換性がありません。
    C#とVB.NETのプロジェクト設定を確認してみてください。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100023  Re[6]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ ぱんだ -(2022/06/29(Wed) 16:20:12)
    No100020 (radian さん) に返信
    > 2022/06/29(Wed) 16:04:09 編集(投稿者)
    >
    > ■No100018 (ぱんだ さん) に返信
    >>■No100017 (radian さん) に返信
    >>
    >>>>c#で作ったDLLをvb.netで使おうとすると、【BC30652:型[object]を含むアセンブリ['〜']への参照が必要です。参照をプロジェクトへ追加してください。】というエラーが出ます。
    > >>
    > >>で、名前が伏せられているので判りませんんが、そのエラーメッセージに参照しているアセンブリ名が表示されている筈です。
    >>
    >>エラー内容を端折ってしまいすみません。
    >>BC30652 型 '[Object]' を含むアセンブリ 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' への参照が必要です。参照をプロジェクトに追加してください。
    >>と出ています。
    >>
    >
    > 何となく、プロジェクトの.NETフレームワークのバージョンが噛み合ってない気が。
    > 例えば、.NET Framework 4.x系と.NET5〜6のライブラリは互換性がありません。
    > C#とVB.NETのプロジェクト設定を確認してみてください。

    ご丁寧にご回答いただきありがとうございます。
    vb.netのプロジェクトが少し古いものなので、ご指摘の通りフレームワークのバージョンがあっていないかも知れません。
    設定を確認して調整したいと思います。
    この部分だけでかなり時間がかかってしまっていたのでアドバイスいただき助かりました。
    ありがとうございます。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100035  Re[7]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ Azulean -(2022/06/29(Wed) 21:11:54)
    No100023 (ぱんだ さん) に返信
    > vb.netのプロジェクトが少し古いものなので、ご指摘の通りフレームワークのバージョンがあっていないかも知れません。
    > 設定を確認して調整したいと思います。


    ちなみに、.NET Framework 4.x から .NET 5/6 などへの変更、およびその逆への変更は「設定の変更」というレベルでは実現できません。
    プロジェクトファイルを手動で書き換えるとか、知識を持った上での対応が必要なので、基本的に「その DLL は使えない」と判断するところかと思います。

    どうしてもその DLL を使うのが必須要件なのであれば、アプリ側を .NET 5/6 に移行する作業をするところですね。
    (.NET 5 は VS2019 以上、.NET 6 は VS2022 以上が必要)

    なお、.NET 5 Runtime はもうサポート終了しています。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100041  Re[8]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ ぱんだ -(2022/06/30(Thu) 13:11:01)
    No100035 (Azulean さん) に返信

    > ちなみに、.NET Framework 4.x から .NET 5/6 などへの変更、およびその逆への変更は「設定の変更」というレベルでは実現できません。
    > プロジェクトファイルを手動で書き換えるとか、知識を持った上での対応が必要なので、基本的に「その DLL は使えない」と判断するところかと思います。

    ご回答ありがとうございます。
    vb.netのターゲットフレームワークが.NET Framework 4 Client Profile
    C#のDLLのターゲットフレームワークが.NET5.0
    になります。
    フレームワークを変えたりして色々やってみましたが、ビルドは通るようになるけど動かすと別の場所でエラーが発生してしまったりしています。
    フレームワークは今まで指示されたものを設定していただけなので、知識はありません。
    vb.netのフレームワークを.NET Framework 4.7.2へあげる
    .NET Framework 4.7.2をインストールしてC#のDLLを.NET Framework 4.7.2で作り直してコンパイル
    という方法でも難しいでしょうか?
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100044  Re[9]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ 魔界の仮面弁士 -(2022/06/30(Thu) 14:16:52)
    No100041 (ぱんだ さん) に返信
    > vb.netのフレームワークを.NET Framework 4.7.2へあげる
    > .NET Framework 4.7.2をインストールしてC#のDLLを.NET Framework 4.7.2で作り直してコンパイル
    > という方法でも難しいでしょうか?

    DLL 側のライブラリと EXE 側のライブラリを揃えましょう。

    C# DLL が .NET (.NET Core) の場合、VB EXE 側も .NET にする必要があります。
    C# DLL が .NET Framework の場合は、VB EXE 側も .NET Framework にします。
    C# DLL が .NET Standard の場合は、VB EXE 側は .NET Framework でも .NET でも構いません。
    (.NET Standard 対応の DLL を作成するには、ある程度の知識が求められるため、経験が浅い時点ではお奨めしません)



    ところで、4.7.2 を選択されたのは何故でしょうか?

    Windows 10 (1903 以降) や Windows 11 は、既定で .NET Framework 4.8 を搭載しています。
    Windows 10 (1803/1809) が .NET Framework 4.7.2 世代でしたが、現時点において
    Windows 10 21H2 未満のバージョンは既にサポートを終了しているため、
    必然的に、.NET Framework 4.8 一択ということになります。

    Windows 8.1 だと .NET Framework 4.5.1 以上が搭載されているのですが、
    .NET Framework 4.6.2 未満のサポートは終了しています。Windows 8.1 のサポートは
    来年 1 月までなので、現状ではさほど気にしなくても良いかも。


    ただし Windows Server で使う場合は、サーバー管理者と相談してください。
    たとえばサーバーを再起動したくないといった運用上の都合で、最新版が導入されて
    いないなどの理由で、あえて古いバージョンの .NET Framework が必要とされるケースがあります。


    そういった特別な事情が無い場合は、個人的には 4.8 をお奨めします。
    Visual Studio の選択肢に .NET Fraemwork 4.8 が現れない場合は、下記を参照してみてください。
    https://www.curict.com/item/83/8390a94.html
    https://dotnet.microsoft.com/ja-jp/download/dotnet-framework/net48
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100045  Re[10]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ 魔界の仮面弁士 -(2022/06/30(Thu) 14:32:02)
    No100044 (魔界の仮面弁士) に追記
    > そういった特別な事情が無い場合は、個人的には 4.8 をお奨めします。

    言葉が足りなかったので補足。

    .NET Framework を選択するのであれば、4.8 を推奨…という意味です。
    現状の C# DLL が .NET なら、VB EXE 側を .NET にするという方向でも OK ですね。



    ただし .NET と .NET Framework では、サポート サイクルが異なるため、
    バージョン選定には注意が必要です。

    .NET Framework 4.8 のサポート期限は、その OS のサポート期限に従います。
    Window Server 2019 で使うなら 2029/01/09 までのサポートとなりますし、
    Window Server 2022 で使うなら 2031/10/14 までのサポートといった具合です。


    ところが .NET の場合は事情が変わります。
    .NET 6 / .NET 8 などの偶数バージョンは 3 年間
    .NET 5 / .NET 7 などの奇数バージョンは 1 年半
    というサイクルとなっており、.NET Framework よりもサイクルが短く設定されています。
    https://dotnet.microsoft.com/ja-jp/platform/support/policy/dotnet-core


    サポート期限が切れたからと言って、突然使えなくなったりはしないですが、
    未サポートのまま使い続けるのは、望ましいものでは無いですよね。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

■100043  Re[9]: C#で作成したDLLをvb.netで使うとコードエラーが出る
□投稿者/ radian -(2022/06/30(Thu) 14:12:44)
    No100041 (ぱんだ さん) に返信
    > vb.netのフレームワークを.NET Framework 4.7.2へあげる
    > .NET Framework 4.7.2をインストールしてC#のDLLを.NET Framework 4.7.2で作り直してコンパイル
    > という方法でも難しいでしょうか?

    C# 8.0以上の構文を使用していなければ、おそらくそれでも行けると思います。
    コンパイルエラーになるなら、C#ソース側の修正が必要かもしれません。
記事No.100014 のレス /過去ログ174より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 >>

パスワード/

- Child Tree -