Excel DNA - 在回调中将 C# 字符串编组为 VBA ByRef
Excel DNA - Marshal C# string to VBA ByRef in callback
我正在尝试使用 Excel-DNA 从 C# 代码在 Excel 中调用 VBA 回调。在弄乱了特定的数据类型和编组声明之后,我终于能够创建一个工作示例:
C#代码
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ProgId("CSharpComObject")]
public partial class CSharpComObject
{
Dictionary<string, Callback> _callbackMap = new Dictionary<string, Callback>();
public void SubscribeStringData(string topic, [MarshalAs(UnmanagedType.FunctionPtr)] Callback callback)
{
_callbackMap[topic] = callback;
}
public void RaiseCallback(string topic, string data)
{
_callbackMap[topic](data);
}
public delegate void Callback([MarshalAs(UnmanagedType.BStr)] string data);
}
VBA 模块
Option Explicit
Dim testObj As Object
Sub Subscribe()
Set testObj = CreateObject("CSharpComObject")
testObj.SubscribeStringData "someTopic", AddressOf StringDataCallback
End Sub
Sub StringDataCallback(ByVal data As String)
MsgBox "StringDataCallback Raised [" + data + "]"
End Sub
问题
从上面的代码示例中可以看出,字符串的默认 COM 编组是 BStr
a.k.a。 ByVal ... As String
.
我想知道是否有办法将字符串数据(或与此相关的任何对象类型)传递给 VBA 回调 ByRef
,如果可以,C# 声明和需要编组属性?
将参数指定为 ref string
应该可以。
有关字符串封送处理选项的详细信息,请参阅 https://msdn.microsoft.com/en-us/library/s9ts558h(v=vs.110).aspx。
我正在尝试使用 Excel-DNA 从 C# 代码在 Excel 中调用 VBA 回调。在弄乱了特定的数据类型和编组声明之后,我终于能够创建一个工作示例:
C#代码
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ProgId("CSharpComObject")]
public partial class CSharpComObject
{
Dictionary<string, Callback> _callbackMap = new Dictionary<string, Callback>();
public void SubscribeStringData(string topic, [MarshalAs(UnmanagedType.FunctionPtr)] Callback callback)
{
_callbackMap[topic] = callback;
}
public void RaiseCallback(string topic, string data)
{
_callbackMap[topic](data);
}
public delegate void Callback([MarshalAs(UnmanagedType.BStr)] string data);
}
VBA 模块
Option Explicit
Dim testObj As Object
Sub Subscribe()
Set testObj = CreateObject("CSharpComObject")
testObj.SubscribeStringData "someTopic", AddressOf StringDataCallback
End Sub
Sub StringDataCallback(ByVal data As String)
MsgBox "StringDataCallback Raised [" + data + "]"
End Sub
问题
从上面的代码示例中可以看出,字符串的默认 COM 编组是 BStr
a.k.a。 ByVal ... As String
.
我想知道是否有办法将字符串数据(或与此相关的任何对象类型)传递给 VBA 回调 ByRef
,如果可以,C# 声明和需要编组属性?
将参数指定为 ref string
应该可以。
有关字符串封送处理选项的详细信息,请参阅 https://msdn.microsoft.com/en-us/library/s9ts558h(v=vs.110).aspx。