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

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

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

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

Q&A

解決済

1回答

2367閲覧

test.vbの参照

chintao1224

総合スコア155

VB.NET

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

0グッド

0クリップ

投稿2017/07/16 07:25

visualstudio2017を使っています。community版です。
test.vbのクラスファイルをプロジェクトに追加しています。
test.vbの中の関数test1をスタートアップ画面のボタンクリックで使っています。
プロジェクトを実行すると、dllが認識できていないというエラーが出ます。
test.vbをビルドしたdllだと思います。
参照はどうすれば良いのでしょうか。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/07/16 08:55

「dllが認識できていないというエラー」の具体的なエラーメッセージの追記をお願いします。dllは例えばClassLibrary1.dll、ClassLibrary2.dllとあって、両方に test クラス、test1 関数が定義されていて、それらを切り替えて動的に呼び出したいと言うことでしょうか。
chintao1224

2017/07/16 12:20 編集

エラーメッセージは「DLL'test.dll'を読み込めません。指定されたモジュールが見つかりません」と出ています。仰っていることはやってません。単にtest.vbの中の関数を使いたいだけです。importか何か必要なのでしょうか?
chintao1224

2017/07/16 12:29

ちなみにクラスファイルを使うとき、newしなくてよいときはあるのでしょうか?
guest

回答1

0

ベストアンサー

こんな感じでできると思います。

1.Visual Studio を起動、新規プロジェクト、WPFアプリ (.NET Framework)、WpfApp1。
2.ソリューション WpfApp1 で右クリック、追加、新しいプロジェクト、クラスライブラリ (.NET Framework)、ClassLibrary1。
3.ClassLibrary1 の Class1 にコードを書く。
4.WpfApp1、My Projectをダブルクリック、参照、追加、プロジェクト、ソリューション、ClassLibrary1にチェックを入れてOK押下。
5.WpfApp1 の MainWindow にボタンを2個配置、コードを書く。
6.実行。

ClassLibrary1\Class1.vb

VB.NET

1Public Class Class1 2 3 Function Test1() As String 4 Return "Test1" 5 End Function 6 7 Shared Function Test2() As String 8 Return "Test2" 9 End Function 10 11End Class

WpfApp1\MainWindow.xaml.vb

VB.NET

1Class MainWindow 2 3 Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click 4 Dim obj As New ClassLibrary1.Class1 5 Dim result = obj.Test1() 6 MessageBox.Show(result) 7 End Sub 8 9 Private Sub Button2_Click(sender As Object, e As RoutedEventArgs) Handles Button2.Click 10 Dim result = ClassLibrary1.Class1.Test2() 11 MessageBox.Show(result) 12 End Sub 13 14End Class

ここでは WPFアプリにしてますが、ユニバーサルWindowsアプリでも基本的な流れは同じです。ユニバーサルWindowsアプリの場合は、「クラスライブラリ (.NET Framework)」の代わりに「クラスライブラリ (ユニバーサル Windows)」を選んでください。

関数 Test2 には Shared キーワードがついています。これがあると New をしなくても呼び出せます。

上記は1つのソリューションに2つのプロジェクト(EXEとDLL)を含める形でしたが、別々のソリューションでDLLを参照する場合は以下のようにします。

1.Visual Studio を起動、新規プロジェクト、クラスライブラリ (.NET Framework)、ClassLibrary1。
2.ClassLibrary1 の Class1 にコードを書く。
3.ビルド(dllファイルを作る)
4.Visual Studio を起動、新規プロジェクト、WPFアプリ (.NET Framework)、WpfApp1。
5.My Projectをダブルクリック、参照、追加、参照(B)...、さきほど作ったdllファイルを選択、OK。
6.MainWindow にボタンを2個配置、コードを書く。
7.実行。
※dllはobjとbinの2箇所にできますが、binにある方を使ってください。

投稿2017/07/16 13:25

編集2017/07/16 13:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chintao1224

2017/07/16 14:07

クラスファイルtest.vbは購入したファイルです。編集することはできません。やったことは、プロジェクトにtest.vbを追加しただけです。クラスファイルをプロジェクトに追加しただけでは参照できていないのでしょうか?importが必要なのでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/16 14:35

test.vbと言うのは製品名なのでしょうか、それともファイル名なのでしょうか。test.vbと言うファイル名で、中身が普通のソースコード(テキストファイル)で「Class ~」で始まっているのであれば、プロジェクト名(例:WpfApp1)で右クリック、追加、既存の項目を選んで追加してください。test.dllと言うファイル名なのであれば、My Projectをダブルクリック、参照、追加、参照(B)...を選んで追加してください。
退会済みユーザー

退会済みユーザー

2017/07/16 15:03

import は Imports(名前空間のインポート)ですよね。呼び出すだけなら特に必要ありませんが、できれば指定した方が良いです。例えば、そのライブラリの名前空間が TestLib で、クラス名が Test だとするとそのまま使う場合は「Dim obj As New TestLib.Test」となりますがコードの最初、またはプロジェクトで「Imports TestLib」を指定すれば「Dim obj As New Test」と言う感じで「TestLib.」を書かなくても使えるようになります。
chintao1224

2017/07/16 15:34

test.vbはファイル名です。仰られているようにプロジェクトを右クリックして既存の項目から追加しました。やったのはそれだけです。で、フォームファイルのボタンクリックでtest.vbのtest1関数を呼び出しています。newしてオブジェクトを作成とかしていないのですが、test1関数に波線は引かれていません。関数の呼び出しはクラス名.test1です。クラス名はクラスファイルtest.vbのクラス名です。実行すると、先ほどお知らせしたエラーメッセージが出ます。
退会済みユーザー

退会済みユーザー

2017/07/16 15:44

となると、呼び出し方自体は合っていて、その test1 関数の中で test.dll を動的に呼び出していて、そのdllが見つからないと言うことですね。購入した製品には dll はついていなかったのでしょうか。ついているのであれば、そのdllもプロジェクトに参照設定で追加してください。ついていないのであれば、購入元に問い合わせて入手してください。
chintao1224

2017/07/16 15:53

dllはついていましたが、プロジェクトに参照しようとしても「dllへの参照を追加できませんでした。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください。」とメッセージが出て参照できません。
退会済みユーザー

退会済みユーザー

2017/07/16 16:05

となると、プロジェクトで右クリック、追加、既存の項目、種類を実行可能ファイル(exe,dll,ocx)にして、そのdllファイルを追加してください。追加されたdllを選択し、プロパティを表示させ、「出力ディレクトリにコピー」を「常にコピーする」にしてください。他に関連ファイルが同梱されていれば、同様の方法で追加してください。こうすると、ビルドしたときにbinディレクトリにexeとdllが一緒にコピーされ、dllが参照できるようになると思います。
chintao1224

2017/07/16 17:09

教えてもらったとおりにやったのですが、「間違ったフォーマットのプログラムを読み込もうとしました」とエラーが出てtest1関数で止まってしまいます。どうすれば良いのでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/16 17:58

My Project、コンパイルで、ターゲットCPUを「AnyCPU」にし、「32ビットを優先」にチェックを入れてください。逆に「32ビットを優先」のチェックを外した状態でも試してみてください。
退会済みユーザー

退会済みユーザー

2017/07/16 18:15

あと、呼び出し元のプログラム(exe)がユニバーサルアプリだとそのdllが使えない可能性があります。その場合はクラシックデスクトップ(WPFアプリ、Windowsフォームアプリケーション)でexeを作り直す必要があります。
chintao1224

2017/07/16 18:18

32ビットを優先をチェックを外すとエラーが取れました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/07/16 18:20

それはよかったです。お疲れ様でした。(^^)
chintao1224

2017/07/17 02:04

すみません、もう一つだけ教えてください。仰られるようにユニバーサルアプリで作っていました。何故ユニバーサルアプリだと参照できないんでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/17 05:42

ユニバーサルアプリはUWP(WinRT API)という全く新しいOS上で動くアプリと考えてください。Windows と MacOS と Android と iOS と UWP と言う OS がそれぞれあると考えてください。Windows用のアプリがMacOSで動かない、Android用のアプリがiOSで動かないのと一緒で、Windows(Win32 API)用のアプリはUWP(WinRT API)では動きません。DLLがWindows(Win32 API)を想定したものだった場合、ユニバーサルアプリから見ると違うOSの異質なプログラムに見えるので「間違ったフォーマットのプログラムを読み込もうとしました」となります。正確には「なる可能性がある」だけで、マイクロソフトの実装次第では普通に動いてしまうのかもしれません。普通に考えると、過去のAPIを許容してしまうとセキュリティを維持することが困難になるので、呼び出せないようにすると思います。すいません、UWPは概念は知っているものの、積極的には使ったことないので、間違ったことを言っている可能性があります。正確なところはご自身で情報収集や、実験して確認してみてください。
chintao1224

2017/07/23 09:53

遅くなり申し訳ございません。勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問