gpt4 book ai didi

c# - 在 EXCEL VBA 中使用 C# dll

转载 作者:可可西里 更新时间:2023-11-01 08:20:09 29 4
gpt4 key购买 nike

我在这里遇到了一个小问题,需要你们的帮助。

我有一个通过 COM 互操作公开的 C# DLL。它工作正常,但显然 C# 互操作对象的部署是一场灾难,每次更新 DLL 时都需要重新加载。

所以我想知道如何使用此 C# DLL 中的函数,如下所示:或者我可以通过将 DLL 和电子表格放在一起来调用函数的任何东西。

Declare Function getString Lib "<PATH of my DLL>" () as string

sub test()
range("A1").value = getString
End Sub

语法可能有误。

最佳答案

你可以这样做,但你必须了解 VBA 和 .Net 的区别。
首先,您必须创建一个实际的 DLL(.Net 程序集不是),为此,请使用 this project template .话又说回来,你必须知道如何编码东西。
VBA 只支持 stdcall 作为调用约定,它不能真正处理 DLL 函数的 Unicode。这本身并不坏,因为 .Net 中 String 的默认编码(marshal)处理是 VBA 所期望的(指向 Ansi 字符的指针)。此外,stdcall 是我用于导出的默认调用约定。

我将重用我最近为另一个 SO 线程创建的示例:

将其放入您使用我的模板创建的项目中:

[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class Sample
{
public string Text
{
[return: MarshalAs(UnmanagedType.BStr)]
get;
[param: MarshalAs(UnmanagedType.BStr)]
set;
}

[return: MarshalAs(UnmanagedType.BStr)]
public string TestMethod()
{
return Text + "...";
}
}

static class UnmanagedExports
{
[DllExport]
[return: MarshalAs(UnmanagedType.IDispatch)]
static Object CreateDotNetObject(String text)
{
return new Sample { Text = text };
}
}

这是从 VBA 中调用它的方法:

Declare Function CreateDotNetObject Lib "The full path to your assembly or just the assembly if it is accessible from Excel" _
(ByVal text As String) As Object

Sub test()

Dim instance As Object

Set instance = CreateDotNetObject("Test 1")
Debug.Print instance.Text

Debug.Print instance.TestMethod

instance.text = "abc 123" ' case insensitivity in VBA works as expected'

Debug.Print instance.Text
End Sub

关于c# - 在 EXCEL VBA 中使用 C# dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6340041/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com