VB6時代のdllをC#から呼び出して使う方法をメモしておきます。
呼び出すdll
C#から呼び出すdllは、PCView by DLLをお借りしました。
http://www.vector.co.jp/soft/dl/win95/prog/se234999.htmlCPUの情報を取得するdllのようです。
サンプル
C#からdllを呼び出すには、System.Runtime.InteropServices名前空間にある
DllImportを使用します。
ざっくりなサンプルは以下のとおり。
- using System;
- using System.Text;
- using System.Runtime.InteropServices;
- public class Sample {
-
- [DllImport("PCView.DLL")]
- public static extern int CpuIDsupport();
-
- [DllImport("PCView.DLL")]
- public static extern int VenderID(StringBuilder buffer, int bufsiz);
-
- [DllImport("PCView.DLL")]
- public static extern int BrandString(StringBuilder buffer, int bufsiz);
-
- public static void Main(string[] args) {
- Console.WriteLine(CpuIDsupport());
-
- StringBuilder sb = new StringBuilder(64);
- int ret = VenderID(sb, 64);
- Console.WriteLine(ret);
- Console.WriteLine(sb + "<==END");
-
- ret = BrandString(sb, 64);
- Console.WriteLine(ret);
- Console.WriteLine(sb + "<==END");
- }
- }
ちなみに、添付されていたVB6のサンプルコードの宣言は以下のとおり。
- Private Declare Function CpuIDsupport Lib "PCView.DLL" () As Long
- Private Declare Function VenderID Lib "PCView.DLL" (ByVal buffer As String, ByVal bufsiz As Long) As Long
- Private Declare Function BrandString Lib "PCView.DLL" (ByVal buffer As String, ByVal bufsiz As Long) As Long
こちらを参考に、C#へ移植しました。
Win32 APIやDLL関数を呼び出すには?ビルドして実行すると、こんなエラーが表示されます。
ハンドルされていない例外: System.BadImageFormatException: 間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外: 0x8007000B)
場所 Sample.CpuIDsupport()
場所 Sample.Main(String[] args)
間違ったフォーマットのプログラムを読み込もうとしました。
http://d.hatena.ne.jp/none53/20100707/1278470575こちらがとても参考になりました。
ビルドと実行は、Windows 2008 R2で行ったため、32bitでビルドするよう
コンパイラに指定しないといけないようです。
コンパイルは、特にツールを使用せず、バッチファイルで実行しています。
C# バッチファイルでソースをコンパイルするこんなバッチファイルで実行していたのを、
@echo off
set csc=C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /nologo
%csc% sample.cs
こんな感じで、プラットフォーム指定のオプションを追加しました。
@echo off
set csc=C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /nologo /platform:x86
%csc% sample.cs
実行すると警告が表示されます。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Data.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Data.OracleClient.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.EnterpriseServices.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Transactions.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Web.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'mscorlib.dll' は異なるプロセッサを対象にしています。
64じゃない方を指定すれば、警告は表示されなくなりました。
@echo off
set csc=C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /nologo /platform:x86
%csc% sample.cs
実行してみると、ちゃんとdllから値が取得で射ている模様です。
1
4
GenuineIntel<==END
-2147483638
QEMU Virtual CPU version 1.0<==END
【参考URL】
PCView by DLL(CPUID)
CPUID命令を使用し情報収集を行うDLL CPUの情報を収集、表示することが可能
http://www.vector.co.jp/soft/dl/win95/prog/se234999.htmlWin32 APIやDLL関数を呼び出すには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html間違ったフォーマットのプログラムを読み込もうとしました。
http://d.hatena.ne.jp/none53/20100707/1278470575/platform (C# コンパイラ オプション)
http://msdn.microsoft.com/ja-jp/library/vstudio/zekwfyz4.aspx- 関連記事
テーマ:プログラミング - ジャンル:コンピュータ
- 2012/12/24(月) 18:44:03|
- 備忘録
-
| トラックバック:0
-
| コメント:0
- | 編集