Excel'de C# kodundan Excel-DNA kullanarak bir VBA çağrısı başlatmaya çalışıyorum.Excel DNA - Marshal C# dizesi VBA ByRef geri aramada
C# Kod
[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 Modülü
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
: Belirli veri türleri ile karıştırmasını ve beyanları marshalling sonra nihayet bir çalışma örneği oluşturmak başardı
Yukarıdaki kod örneği görebileceğiniz gibi Soru, dizeleri için varsayılan COM manevra BStr
nam-ı ByVal ... As String
olduğunu.
Dize verilerini (veya bu konuya ilişkin herhangi bir nesne türünü) VBA geri çağrısına ByRef
iletmenin bir yolu olup olmadığını merak ettim ve eğer öyleyse, C# bildirimleri ve sıralaması özellikleri ne olmalıdır?
"Ref string" denediniz mi? – Govert
Eğer erken bağlayıcı bir yaklaşım kurabiliyorsanız, bir olay daha açık olacaktır (bu sizin sorunuza cevap vermeyecektir). – Govert
@Govert, Buna inanamıyorum (bir grup gofre rehberi “Marshal” denedikten sonra), ama sadece “ref” anahtar kelimesini C# tarafına koymanız bunu yapar. Resmi bir cevap yaz ve kabul edeceğim. – nicholas