我在这里看过类似的答案,但没有一个能完全回答我的问题。
我有一个C# XLL,它包含一个UDF(由ExcelDNA提供支持)和一些帮助类和方法-其中之一是这个:
namespace Data_Tool
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class DataCache
{
public static Dictionary<string, DataCache> calcs = new Dictionary<string, DataCache> { };
string filepath;
object[,] data;
// Class constructor
public DataCache(string filepath)
{
this.filepath = filepath;
this.data = new object[,] { };
}
public static void RemoveCache(string filename)
{ // This allows an external entity to call and remove cached data for a particular file
if (calcs.ContainsKey(filename)) calcs.Remove(filename);
}
}
}
字符串
我尝试做的是在Excel中使用一个事件处理程序(BeforeClose事件)来触发上面的最后一个方法(RemoveCache)-目的是在文件关闭时从'calcs'字典中删除缓存的项目。我的JavaScript代码尝试像这样MapXLL函数,但我总是在尝试执行时得到一个入口点未找到的错误:
#If Win64 Then
Declare PtrSafe Sub RemoveCache Lib "DataTool-AddIn64.xll" (filename As String)
#Else
Declare PtrSafe Sub RemoveCache Lib "DataTool-AddIn.xll" (filename As String)
#End If
Public Sub test()
RemoveCache ThisWorkbook.FullName
End Sub
型
你会看到,在我的C#天真,我试图使用ComVisible暴露RemoveCache方法COM -但显然这是不正确的。我不太确定如何更改我的代码,使RemoveCache可从COM调用。
1条答案
按热度按时间0md85ypi1#
我发现了一个稍微有点古怪的解决方案-因为我已经在使用ExcelDNA在同一个XLL中生成了一些UDF,我刚刚做了一个名为RemoveCache的void函数,它可以执行相同的操作-或者实际上只是为我调用C#中的方法。这允许我使用Application.Run在JavaScript中调用该函数:
字符串
然后我的C#中的UDF代码是:
型
其中RemoveCacheItem是我在DataCache类中重命名的方法,来自我最初的问题。
使用这种方法是否有任何陷阱,因为它很简单,所以我喜欢它?