私は、ユーザーが独自の VB コードを記述してタスクを自動化できるアプリケーションを管理しています。ユーザー コードはVBCodeProviderを使用してコンパイルされ、アプリケーションの実行中のインスタンスに対して呼び出されます。.NET 2 から始めて、数年間これを行ってきました。
従来、コンパイラ設定でSystem名前空間をインポートしていたため、ユーザーはSystem. いつも。しかし、.NET 4 に移行すると、 Windows.Forms.Formなどのステートメントがコンパイルされなくなることがわかりました。エラーは「タイプ 'Windows.Forms.Form' が定義されていません」でした。他の名前空間が機能するため、これは奇妙です。IO.StreamとReflection.Assemblyは、最初にSystemがないとエラーになりません。
簡単な例を作成しました。以下のコードをファイルに入れました。次に、.NET2 ディレクトリと .NET4 ディレクトリの両方からvbc.exeを使用してこのファイルをコンパイルしました。2バージョンは正常に動作します。変数f2をコメントアウトしない限り、バージョン 4 はコンパイルされません。
Imports System
Public Class MyClassName
Public Shared Sub Main
'this works in v2 and v4
Dim f As New System.Windows.Forms.Form
f.ShowDialog
'this does not work in v4
Dim f2 As New Windows.Forms.Form
f2.ShowDialog
End Sub
End Class
これをvbc.exeバージョン4でコンパイルする方法を知っている人はいますか? そして、あなたが「ユーザーに System.Windows.Forms と入力するように言ってください」と言う前に、私は彼らがそうしてくれたら素晴らしいだろうということに同意しますが、ユーザーはユーザーが行うことを行い、私はそれを解決しなければなりません。
アップデート:
Windows.Foundation.Diagnostics名前空間がWindow.Formsの省略された使用と衝突を引き起こしていることがわかりました。この名前空間をコンパイルから隠す方法はありますか? Visual Studio 2010 には同じ競合がないため、何らかの方法で回避しているに違いありません。