WScript в VB.NET? - PullRequest
       18

WScript в VB.NET?

7 голосов
/ 06 марта 2012

Это фрагмент кода из моей программы:

WSHShell = WScript.CreateObject("WScript.Shell")

Но по какой-то причине "WScript" не объявлен. Я знаю, что этот код работает в VBScript, но я пытаюсь заставить его работать с vb.net. Что не так?

1 Ответ

11 голосов
/ 07 марта 2012

Объект WScript специфичен для Windows Script Host и не существует в .NET Framework.

На самом деле, все функциональные возможности объекта WScript.Shell доступны в классах .NET Framework.Поэтому, если вы переносите код VBScript в VB.NET, вам следует переписать его, используя классы .NET, а не COM-объекты Windows Script Host.

Если по какой-то причине вы все равно предпочитаете использовать COM-объекты, вам необходимо добавить соответствующие ссылки на COM-библиотеки в ваш проект, чтобы эти объекты были доступны для вашего приложения.В случае WScript.Shell это % WinDir% \ System32 \ wshom.ocx (или % WinDir% \ SysWOW64 \ wshom.ocx в 64-битной Windows).Тогда вы можете написать код так:

Imports IWshRuntimeLibrary
....
Dim shell As WshShell = New WshShell
MsgBox(shell.ExpandEnvironmentStrings("%windir%"))

Кроме того, вы можете создавать экземпляры COM-объектов, используя

Activator.CreateInstance(Type.GetTypeFromProgID(ProgID))

, а затем работать с ними, используя позднюю привязку.Например, *:

Imports System.Reflection
Imports System.Runtime.InteropServices
...

Dim shell As Object = Nothing

Dim wshtype As Type = Type.GetTypeFromProgID("WScript.Shell")
If Not wshtype Is Nothing Then
    shell = Activator.CreateInstance(wshtype)
End If

If Not shell Is Nothing Then
    Dim str As String = CStr(wshtype.InvokeMember(
        "ExpandEnvironmentStrings",
        BindingFlags.InvokeMethod,
        Nothing,
        shell,
        {"%windir%"}
    ))
    MsgBox(str)

    ' Do something else

    Marshal.ReleaseComObject(shell)
End If

* Я плохо знаю VB.NET, поэтому этот код может быть уродливым;не стесняйтесь улучшать.

...