我管理一个允许用户通过编写自己的VB代码来自动执行任务的应用程序。用户代码使用 VBCodeProvider 进行编译,并针对正在运行的应用程序实例进行调用。从.NET 2开始,我们已经做了几年了。
传统上,我们在编译器设置中导入了 System 命名空间,因此用户无需一直编写 System。。但是,当我们使用.NET 4时,我们发现像 Windows.Forms.Form 这样的语句将不再编译。错误是“类型'Windows.Forms.Form'未定义。”这很奇怪,因为其他名称空间有效。 IO.Stream 和 Reflection.Assembly 在开头没有系统时没有错误。
我创建了一个简单的例子。我把下面的代码放到一个文件中。然后我从.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没有相同的冲突,因此必须以某种方式绕过它。