質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

4027閲覧

VB.Net → C# 焼き直し

msz006

総合スコア66

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/10/23 11:50

VB.netからC#に焼き直すときにモジュールの部分はどうすればいいですか?

'******************************************************************************* ' felicalib.dll のヘッダファイル felicalib.h を VB.NET 用に変換してみました。 ' このままでは使いづらいので、CFelicaLib.vb で多少は扱いやすいようにしています。 '******************************************************************************* Imports System.Runtime.InteropServices Imports UInt8 = System.Byte Module modFelicaLib Private Const MAX_SYSTEM_CODE = 8 Private Const MAX_AREA_CODE = 16 Private Const MAX_SERVICE_CODE = 256 '------------------------------- ' FeliCa の情報を格納する構造体 '------------------------------- <StructLayout(LayoutKind.Sequential)> _ Public Structure felica Public p As IntPtr 'PaSoRi ハンドル Public systemcode As UInt16 'システムコード <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _ Public IDm() As UInt8 'IDm <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _ Public PMm() As UInt8 'PMm 'systemcode Public num_system_code As UInt8 '列挙システムコード数 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=MAX_SYSTEM_CODE)> _ Public system_code() As UInt16 '列挙システムコード 'area/service codes Public num_area_code As UInt8 'エリアコード数 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=MAX_AREA_CODE)> _ Public area_code() As UInt16 'エリアコード <MarshalAs(UnmanagedType.ByValArray, SizeConst:=MAX_AREA_CODE)> _ Public end_service_code() As UInt16 'エンドサービスコード Public num_service_code As UInt8 'サービスコード数 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=MAX_SERVICE_CODE)> _ Public service_code() As UInt16 'サービスコード End Structure '----------- ' constants '----------- 'システムコード (ネットワークバイトオーダ/ビックエンディアンで表記) Public Const POLLING_ANY = &HFFFF Public Const POLLING_EDY = &HFE00 'システムコード: 共通領域 (Edyなどが使用) Public Const POLLING_SUICA = &H3 'システムコード: サイバネ領域 '------ ' APIs '------ '【関 数 名】pasori_open '【第1引数】[in] dummy '【戻 り 値】pasori ハンドル <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Function pasori_open(ByVal dummy As IntPtr) As IntPtr End Function '【関 数 名】pasori_close '【第1引数】[in] p pasoriハンドル (pasori_open で得たポインタを指定する) <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Sub pasori_close(ByVal p As IntPtr) End Sub '【関 数 名】InteropServices '【第1引数】[in] p pasoriハンドル (pasori_open で得たポインタを指定する) '【戻 り 値】エラーコード <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Function pasori_init(ByVal p As IntPtr) As Integer End Function '【関 数 名】felica_polling '【第1引数】[in] p pasoriハンドル (pasori_open で得たポインタを指定する) '【第2引数】[in] systemcode システムコード '【第3引数】[in] RFU RFU (使用しない) '【第4引数】[in] timeslot タイムスロット '【戻 り 値】felicaハンドル (MarshalクラスのPtrToStructureメソッドを使用) <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Function felica_polling( _ ByVal p As IntPtr, _ ByVal systemcode As UInt16, _ ByVal RFU As UInt8, _ ByVal timeslot As UInt8 _ ) As IntPtr End Function '【関 数 名】felica_free '【第1引数】[in] f felicaハンドル (felica構造体のポインタを指定する) <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Sub felica_free(ByVal f As IntPtr) End Sub '【関 数 名】felica_getidm '【第1引数】[in] f felicaハンドル (felica構造体のポインタを指定する) '【第2引数】[out] buf IDm を格納するバッファ(8バイト) <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Sub felica_getidm(ByVal f As IntPtr, ByVal buf As IntPtr) End Sub '【関 数 名】felica_getpmm '【第1引数】[in] f felicaハンドル (felica構造体のポインタを指定する) '【第2引数】[out] buf PMm を格納するバッファ(8バイト) <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Sub felica_getpmm(ByVal f As IntPtr, ByVal buf As IntPtr) End Sub '【関 数 名】felica_read_without_encryption02 '【第1引数】[in] f felicaハンドル (felica構造体のポインタを指定する) '【第2引数】[in] servicecode サービスコード '【第3引数】[in] mode モード(使用しない) '【第4引数】[in] addr ブロック番号 '【第5引数】[out] data データ(16バイト) '【戻 り 値】エラーコード <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Function felica_read_without_encryption02( _ ByVal f As IntPtr, _ ByVal servicecode As Integer, _ ByVal mode As Integer, _ ByVal addr As UInt8, _ ByVal buf As IntPtr _ ) As Integer End Function '【関 数 名】felica_write_without_encryption '【第1引数】[in] f felicaハンドル (felica構造体のポインタを指定する) '【第2引数】[in] servicecode サービスコード '【第3引数】[in] mode モード(使用しない) '【第4引数】[in] addr ブロック番号 '【第5引数】[out] data データ(16バイト) '【戻 り 値】エラーコード <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Function felica_write_without_encryption( _ ByVal f As IntPtr, _ ByVal servicecode As Integer, _ ByVal addr As UInt8, _ ByVal buf As IntPtr _ ) As Integer End Function '【関 数 名】felica_enum_systemcode '【第1引数】[in] p pasoriハンドル (pasori_open で得たポインタを指定する) '【戻 り 値】felicaハンドル (felica構造体のポインタを指定する) <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Function felica_enum_systemcode(ByVal p As IntPtr) As IntPtr End Function '【関 数 名】felica_enum_service '【第1引数】[in] p pasoriハンドル (pasori_open で得たポインタを指定する) '【第2引数】[in] systemcode システムコード '【戻 り 値】felicaハンドル (felica構造体のポインタを指定する) <DllImport("felicalib.dll", CallingConvention:=CallingConvention.Cdecl)> _ Public Function felica_enum_service(ByVal p As IntPtr, ByVal systemcode As UInt16) As IntPtr End Function End Module

クラス化するしか方法はないのですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

VB.NETの Module は内部的には静的クラスとなると思われます。
クラス化するしかないというか、元々Module自体がVBの歴史的な背景から用意されている
特殊なクラス定義のシンタックスシュガーだと思えば良いのではないでしょうか。

投稿2016/10/23 13:42

nakit

総合スコア410

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/10/23 17:38

移植をなるべく楽にという観点からnakitさんがおっしゃるようにstatic classと回答したほうがまずは適切に思えました。自分の回答は参考になりにくかったですね
guest

0

ベストアンサー

ModuleはVBに特有の宣言のようですね。
また、独立したものとして存在するので、C#に直接変換することができないようです。

扱い的には、namespaceがmodFelicaLibの中にある無名のstatic classという扱いが妥当だとは思いますが、扱いやすさから考えるとstatic classがModFelicaLibとしたほうがやりやすいです。

ただし、リファクタリングをしてもかまわないのであれば、Felicaクラスを定義して、ハンドルや暗号化などを隠蔽して、intやstringのみを引数に出来るようにするとすごく使いやすくなると思われます。

余談ですが、私もハンドラを用いた外部のdllとの連携をクラスで書き換えて、サンプルコードを先輩のところに持っていったとき、先輩が言った言葉が「ちゃんと動くコード持ってきて」だったことが忘れられません。コードがあまりに簡潔になったので、動作可能ということが信じられなかったのです。

dllでの連携に、ラッパークラスの適用はおすすめです。

投稿2016/10/23 17:57

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まずはnamespaceと考えるのが自然ではないかという予感がします。予感といった意味はコードの断片だけではプログラムあるいはライブラリーの構成がどうなりそうかはっきりこうといえないということです。

とりあえずnamespaceにしておき必要に応じてリファクタリングすればよろしいのではないでしょうか。

投稿2016/10/23 12:47

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問