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

VBCodeProviderでコンパイル時、Microsoft.VisualBasic.dllを参照から除外したい

環境/言語:[.NET 2.0]
分類:[.NET]

こんにちは。

ある簡単な独自スクリプトをコンパイルするため、VBCodeProviderを使用することを考えています。
(なぜC#じゃなくてVBかというと、スクリプト内でCOMを使えるようにしたので
 パースを簡単にしたい=遅延バインディングを使いたいという思いからです)

その際、普通にVBCodeProviderでコンパイルしたexe/dllは
Microsoft.VisualBasic.dllが参照されている状態となりますが、
スクリプト内からVB特有の関数等を使わせたくないので
除外したいと考えています。

このようなことはできるのでしょうか。
また、除外できたとして、遅延バインディングまで使えなくなることはないのでしょうか。
ご教示お願いします

以上よろしくお願いします
VB9 以降には、/vbruntime コンパイルオプションが用意されています。
http://msdn.microsoft.com/ja-jp/library/bb531259.aspx
.NET 2.0 の場合、SP1 が当たっていれば VB9 コンパイラを利用する…のかな? SP とは無関係に CodeDomProvider を呼び出す側と同じバージョンになるのかな?
それ以前の場合、非ドキュメンテッドの /vbruntimeref コンパイルオプションがあるようです。以下のページによると ReferencedAssemblies にも手を入れる必要があるらしいですが確認してません。
http://d.hatena.ne.jp/k_maru/20061228/1167334517

まあそもそも、遅延バンディング自体 Microsoft.VisualBasic.dll で定義されているメソッド群を駆使して実現されているので、Microsoft.VisualBasic.dll が参照されていなければ不可能ですね。
遅延バンディングがどう表現されているのか、一度サンプルアプリケーションを Reflector.NET で逆コンパイルして確認してみてください。
2010/12/19(Sun) 16:23:57 編集(投稿者)

■No27852に返信(Hongliangさんの記事)
> .NET 2.0 の場合、SP1 が当たっていれば VB9 コンパイラを利用する…のかな?
VB8 コンパイラでも VB9 コンパイラでも、.NET 2.0 対象のアプリを作れますが、
VB2005 が VB9 コンパイラを利用するかと言えば No だと思います。
SP では、VB8 コンパイラの 8.0.50727.* の * 部分が変わるだけかと。

> 非ドキュメンテッドの /vbruntimeref コンパイルオプションがあるようです。
ではなく、/novbruntimeref ですね。
今回は .NET 2.0 なので、/vbruntimeref や /vbruntime は使えません。

> まあそもそも、遅延バンディング自体 Microsoft.VisualBasic.dll で
> 定義されているメソッド群を駆使して実現されているので、
ですね。CallByName を使うにしても、Object の動的メンバ呼び出しにしても。
http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.compilerservices.latebinding.aspx

.NET 2.0 対応の CodeProvider で、遅延バインドできる物としては、
あとは JScriptCodeProvider ぐらいでしょうか。
(今回のケースにおいては、むしろ問題点が悪化するとも言えますが)


>> なぜC#じゃなくてVBかというと、スクリプト内でCOMを使えるようにしたので
いっそ、2010 に更新してしまえば、C# で動的型付けができますよ。

# 昔に戻って、Windows Script Control という手もありますが。
お二方、返信ありがとうございます。

なるほど、確かにVBでコンパイルしたEXEを見たら
大量にMicrosoft.VisualBasic名前空間のものが使われていましたね…

>>いっそ、2010 に更新してしまえば、C# で動的型付けができますよ。
VS2010所有しています。が、スクリプトを動的実行するのが目的ではなく
スクリプトを.NET 2.0向けアセンブリにコンパイルするのが目的なので
今回は見送りとさせていただきますm(_ _)m


諦めてCSharpCodeProvider使います。
スクリプト内のCOM使用部分をどうC#コードに変換してやるかは
これから考えますw

ありがとうございました。
解決済み!

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