none
vbsから File.ReadALLTextメッソッド実行時にIOExceptionが発生する RRS feed

  • 質問

  • お世話になります。

    サンデープログラマーです。

    今回、vbsから.net機能を使用したくCOM相互運用でDLLを作成しましたがvbsから実行しようとすると次の例外が発生してしまいます

    'System.Security.Permission.FileIOPermission,mscorlib.Version=2.0.0.0 Culture=neutral,Publickey Tpken=b77a5c561934e089'のアクセス許可に失敗しました

    自分なりに調査しましたが、分かりません。ご助言をお願いします。

    1.発生する箇所

    (1)COMのプログラム

    下記プログラムの28行目のStreamReaderで発生します。

    Option Explicit On
    Option Strict On
    Imports System
    Imports System.IO
    <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)>
    Public Class ComClass1
        Inherits System.Attribute
    #Region "COM GUID"
        ' これらの GUID は、このクラスおよびその COM インターフェイスの COM ID を
        ' 指定します。この値を変更すると、
        ' 既存のクライアントはクラスにアクセスできなくなります。
        Public Const ClassId As String = "b3a35d7c-8597-4a9c-9be0-6cbf74cf190c"
        Public Const InterfaceId As String = "bc97a948-ec86-44ea-85f4-796df0d70dcc"
        Public Const EventsId As String = "26d6264e-f251-423b-b5fb-2eb4ecbe550b"
    #End Region

        ' 作成可能な COM クラスにはパラメーターなしの Public Sub New() を指定しなければ
        ' なりません。これを行わないと、クラスは COM レジストリに登録されず、
        ' CreateObject 経由で
        ' 作成できません。
        Public Sub New()
            MyBase.New()
        End Sub
        Public Function DataSet(ByVal Path As String, ByRef err As String) As Boolean

            DataSet = False
            Try
                Dim file As New System.IO.StreamReader(Path)
                file.Close()
                DataSet = True

            Catch ex As Exception
                err = ex.Message.ToString()
            End Try
        End Function
    End Class

    (2)VBSのプログラム

    dim Err
    dim R
    set R =CreateObject("ClassLibrary14.ComClass1")
    pathname="C:\バルブデータ正規表現.txt"
    msgbox R.DataSet(pathname,Err)
    msgbox " Error= " & Err
    set R = nothing

    2.実行環境

    (1)仮想PC(Windows7)のドキュメントフォルダで実行。

    3.これまで分かったこと

    (1)仮想PCでもVB.netからDLLを呼び出すと正常に処理できます。仮想PCではvbsからの呼び出しができません。

    (2)ハードディスク付PCであればvbsからDLLを正常に処理できます。

    (3)COM側にattributeをインポートして今回作成したファンクションDataSetに下記を追加してみましたが結果は同じでした。

        <SecurityPermissionAttribute(SecurityAction.Demand, Flags:=SecurityPermissionFlag.AllFlags)>
        <FileIOPermissionAttribute(SecurityAction.Demand, Unrestricted:=True)>

    以上


    わかばマーク

    自己レスです。visual studioでビルド時に作成されるdllとタイプライブラリを自PCのレジストリに登録したらvbsからも実行できました。visual studioでビルドすれば両方ともレジストリに自動登録されるものと思いこんでいました。しかしわたくしのVisual studio 2015 無償版ではタイプライブラリの登録は行われず、regasmを手動でたたく必要があるようでした。

    • 編集済み TasCal 2016年6月21日 3:10
    2016年6月21日 0:51

回答

  • つまみ食いですが、少しだけ。

    コマンドプロンプトで失敗した理由は、UAC です。
    regasm はマシン全体に影響する操作をするので、管理者としての権限が必要です。
    普通にコマンドプロンプトを起動するだけでは管理者の権限がない状態になりますので、コマンドプロンプトを右クリックして管理者として実行など、管理者権限で実行する方法を採る必要があります。

    • 回答としてマーク 星 睦美 2016年9月1日 5:50
    2016年6月21日 13:39
    モデレータ

すべての返信

  • 追伸

    コマンドプロンプトでのregasmではアクセス許可に失敗が出てしまう。VisualStudio2015Communityにインストーラをインストールしsetup exeを作成しdllとtlb登録をしたら解決しました。


    わかばマーク

    2016年6月21日 8:00
  • つまみ食いですが、少しだけ。

    コマンドプロンプトで失敗した理由は、UAC です。
    regasm はマシン全体に影響する操作をするので、管理者としての権限が必要です。
    普通にコマンドプロンプトを起動するだけでは管理者の権限がない状態になりますので、コマンドプロンプトを右クリックして管理者として実行など、管理者権限で実行する方法を採る必要があります。

    • 回答としてマーク 星 睦美 2016年9月1日 5:50
    2016年6月21日 13:39
    モデレータ
  • ご助言いただきありがとうございます。

    わかばマーク

    2016年6月29日 6:05