如何从Excel VBA调用.NET方法?

我找到了一种直接从VBA代码调用.NET 2代码的方法:

Dim clr As mscoree.CorRuntimeHost

Set clr = New mscoree.CorRuntimeHost

clr.Start

Dim domain As mscorlib.AppDomain

clr.GetDefaultDomain domain

Dim myInstanceOfDotNetClass As Object

Set myInstanceOfDotNetClass = domain.CreateInstanceFrom("SomeDotNetAssembly.dll", "Namespace.Typename").Unwrap

Call myInstanceOfDotNetClass.ExecuteSomeDotNetMethod

我使用工具->引用将对mscoree.tlb和mscorlib.tlb的引用添加到Excel VBA。

这适用于.NET CLR 2程序集(最高.NET Framework版本3.5)。

我需要使其与.NET 4一起使用。

我知道.NET CLR4引入了与版本无关的另一种创建运行时实例的方式,并且我发现了一个用C

++编写的代码示例:http :

//dev.widemeadows.de/2014/02/04/hosting-the -net-4-native-native-process

/

我的Excel VBA技能不足以翻译那几行代码。

回答:

默认策略是阻止CLR 4从CLR 2中执行遗留代码:

Set clr = New mscoree.CorRuntimeHost

要启用旧版执行,您可以excel.exe.config在以下位置的文件夹中创建文件excel.exe

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<startup useLegacyV2RuntimeActivationPolicy="true">

<supportedRuntime version="v4.0"/>

</startup>

</configuration>

或者,您可以调用本机函数CorBindToRuntimeEx而不是New mscoree.CorRuntimeHost

Private Declare PtrSafe Function CorBindToRuntimeEx Lib "mscoree" ( _

ByVal pwszVersion As LongPtr, _

ByVal pwszBuildFlavor As LongPtr, _

ByVal startupFlags As Long, _

ByRef rclsid As Long, _

ByRef riid As Long, _

ByRef ppvObject As mscoree.CorRuntimeHost) As Long

Private Declare PtrSafe Function VariantCopy Lib "oleaut32" (dest, src) As Long

''

' Creates a .Net object with the CLR 4 without registration. '

''

Function CreateInstance(assembly As String, typeName As String) As Variant

Const CLR$ = "v4.0.30319"

Static domain As mscorlib.AppDomain

If domain Is Nothing Then

Dim host As mscoree.CorRuntimeHost, hr&, T&(0 To 7)

T(0) = &HCB2F6723: T(1) = &H11D2AB3A: T(2) = &HC000409C: T(3) = &H3E0AA34F

T(4) = &HCB2F6722: T(5) = &H11D2AB3A: T(6) = &HC000409C: T(7) = &H3E0AA34F

hr = CorBindToRuntimeEx(StrPtr(CLR), 0, 3, T(0), T(4), host)

If hr And -2 Then err.Raise hr

host.Start

host.GetDefaultDomain domain

End If

VariantCopy CreateInstance, domain.CreateInstanceFrom(assembly, typeName).Unwrap

End Function

以上是 如何从Excel VBA调用.NET方法? 的全部内容, 来源链接: utcz.com/qa/426959.html

回到顶部