Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从VBA初始化需要初始化的.NET对象(构造函数中的参数)?_.net_Excel_Vba_Com_Activex - Fatal编程技术网

如何从VBA初始化需要初始化的.NET对象(构造函数中的参数)?

如何从VBA初始化需要初始化的.NET对象(构造函数中的参数)?,.net,excel,vba,com,activex,.net,Excel,Vba,Com,Activex,有人知道如何初始化(创建/访问VBA中需要初始化(构造函数中的参数)或静态类的.NET对象吗? 无参数构造函数可以(或多或少)轻松初始化,但我没有成功地用参数初始化类,也没有成功地访问静态类中的函数 想要使用System.IO.File打开文件流,以便从System.Security.Cryptography.SHA512 Managed中使用 目前,我正在输入从字节数组管理的SHA512,但是大小有限制,读取整个文件也很耗时 当前代码: Private Function ReadFileBin

有人知道如何初始化(创建/访问VBA中需要初始化(构造函数中的参数)或静态类的.NET对象吗? 无参数构造函数可以(或多或少)轻松初始化,但我没有成功地用参数初始化类,也没有成功地访问静态类中的函数

想要使用System.IO.File打开文件流,以便从System.Security.Cryptography.SHA512 Managed中使用 目前,我正在输入从字节数组管理的SHA512,但是大小有限制,读取整个文件也很耗时

当前代码:

Private Function ReadFileBinary(FileName As String) As Byte()
    Dim f As Long
    f = FreeFile
    Open FileName For Binary As f
    ReDim ReadFileBinary(LOF(f) - 1)
    Get f, , ReadFileBinary
    Close f
End Function

Public Function FileHashSHA256(FileName As String) As String
    Dim binfile() As Byte
    On Error Resume Next
    binfile = ReadFileBinary(FileName)
    If Err Then
        FileHashSHA256 = "FILE ERROR"
        Err.Clear
        Exit Function
    End If
    Set SHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    FileHashSHA256 = ToHexString(SHA256.ComputeHash_2(binfile))
    If Err Then
        FileHashSHA256 = "HASH ERROR"
        Err.Clear
    End If
    Set SHA256 = Nothing
End Function

Function ToHexString(rabyt)
    With CreateObject("MSXML2.DOMDocument")
        .LoadXML "<root />"
        .DocumentElement.DataType = "bin.Hex"
        .DocumentElement.nodeTypedValue = rabyt
        ToHexString = Replace(.DocumentElement.text, vbLf, "")
    End With
End Function
私有函数ReadFileBinary(文件名为字符串)为字节()
模糊f等于长
f=自由文件
将二进制文件的文件名作为f打开
ReDim ReadFileBinary(LOF(f)-1)
获取f,ReadFileBinary
关闭f
端函数
公共函数FileHashSHA256(文件名为字符串)为字符串
Dim binfile()作为字节
出错时继续下一步
binfile=ReadFileBinary(文件名)
如果有错误,那么
FileHashSHA256=“文件错误”
呃,明白了
退出功能
如果结束
Set SHA256=CreateObject(“System.Security.Cryptography.SHA256Managed”)
FileHashSHA256=ToHexString(SHA256.ComputeHash_2(binfile))
如果有错误,那么
FileHashSHA256=“哈希错误”
呃,明白了
如果结束
设置SHA256=无
端函数
函数tohextstring(rabyt)
使用CreateObject(“MSXML2.DOMDocument”)
.LoadXML“”
.DocumentElement.DataType=“bin.Hex”
.DocumentElement.nodeTypedValue=rabyt
ToHexString=Replace(.DocumentElement.text,vbLf,“”)
以
端函数

我知道这可以以不同的方式完成(例如,使用PowerShell),但要求在禁用PS和.NET编译器的情况下执行此操作。

VBA使用COM。COM不允许在对象创建期间使用参数。您只能在创建后使用接口或方法。但是,您对尺寸的限制是什么?您有这么大的文件吗?可能有大于2GB的磁盘映像文件。同样,对于“较小”的文件,由于内存问题,此操作已经失败(可以在内存中为~420 MB的文件分配字节数组):错误。说明-内存不足是否有任何.NET helper COM组件(反射)这将允许绕过此COM限制/缺点?好吧,420MB很大:-)好吧,我看不到.NET的使用方式有任何解决方案(基本上你没有!)。我看不到任何方法可以创建一个.NET流,而不需要编写一些.NET代码。如果约束条件允许,您可以动态编译和执行一些.NET代码(CodeDom,Roslyn)。VBA使用COM。COM不允许在对象创建期间使用参数。您只能在创建后使用接口或方法。但是,您对尺寸的限制是什么?您有这么大的文件吗?可能有大于2GB的磁盘映像文件。同样,对于“较小”的文件,由于内存问题,此操作已经失败(可以在内存中为~420 MB的文件分配字节数组):错误。说明-内存不足是否有任何.NET helper COM组件(反射)这将允许绕过此COM限制/缺点?好吧,420MB很大:-)好吧,我看不到.NET的使用方式有任何解决方案(基本上你没有!)。我看不到任何方法可以创建一个.NET流,而不需要编写一些.NET代码。如果您的约束条件允许,您可以动态编译和执行一些.NET代码(CodeDom,Roslyn)。