我已经从VB6升级到VB.NET,通过COM在Excel中使用.
在VB6中,我在类中定义了一个属性MyScalars:
Public Property Get Item(vntIndexKey As Variant) As MyScalar
Attribute Item.VB_UserMemId = 0
Set Item = mCol(vntIndexKey)
...
End Property
Run Code Online (Sandbox Code Playgroud)
这似乎使得在Excel VBA中,我可以访问此属性而不指定它(所以像默认属性):
Dim oOut As Object
Set oOut = MyScalars(Range("E10").Value)
Run Code Online (Sandbox Code Playgroud)
VB.NET中有一个等效的属性吗?我尝试了以下但它在VBA中出错:
Default Public ReadOnly Property Item(ByVal vntIndexKey As String) As MyScalar
Get
If mCol.ContainsKey(vntIndexKey) Then
Item = mCol.Item(vntIndexKey)
End If
...
End Property
Run Code Online (Sandbox Code Playgroud) 我对这个很难过.有时候,当我打电话Reflection.Assembly.LoadFile("path to my dll")时会抛出一个OutOfMemoryException.
StackTrace只显示:
at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)
at System.Reflection.Assembly.LoadFile(String path)
Run Code Online (Sandbox Code Playgroud)
并且没有InnerException检查更详细的异常信息.
但是,似乎只通过COM.
让我解释:
我的应用程序可以作为常规旧的exe启动,或通过COM接口通过Excel启动(CreateObject("blahblahblah"))
在初始化我的一个GUI类时,它将静态加载我的所有引擎DLL(我的应用程序有一个引擎和一个GUI)
总共有6个引擎DLL - 静态加载的汇编代码在VB.NET中,看起来有点像这样:
Private Shared dllPath As String = System.IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location) & System.IO.Path.DirectorySeparatorChar)
Private Shared ReadOnly engineDLL1 As Reflection.Assembly = Reflection.Assembly.LoadFile(dllPath + "engineDLL1_name.dll")
...
Private Shared ReadOnly engineDLL6 As Reflection.Assembly = Reflection.Assembly.LoadFile(dllPath + "engineDLL6_name.dll")
Run Code Online (Sandbox Code Playgroud)
我试图加载的引擎DLL是混合程序集(包含本机和托管C++) - 不确定是否重要.
无论如何,使用procexp,我注意到以标准方式打开我的应用程序,所有这些静态加载的DLL都加载正常.但是,如果我通过COM(通过Excel CreateObject("ProgID of the class with the code above"))初始化此类,它将抛出OutOfMemoryException引擎DLLL4.
如果有人可以提供任何见解,那将非常感谢!!
我的应用程序有一个简单的功能,它连接到Excel并将在它们之间执行拖放操作.具体来说,我只是从我的应用程序中取一些文本值,将它们拖到Excel中,然后删除它们.
这在90%的时间都有效,但奇怪的是在某些时候,我的应用程序只是冻结了.我附加调试器并暂停执行,它被卡住了DragDrop.DoDragDrop- 这个函数永远不会返回,我的应用程序将永远挂起.
有没有办法确保DoDragDrop可以返回?还是某种超时?这种情况只有在我将数据放入Excel时才会发生,因此据我所知,丢弃正在完成,函数应该在我的应用程序中返回.
这是我使用的代码:
DragDrop.DoDragDrop(sender as DependencyObject, draggable.GetDragDropString(), DragDropEffects.Copy);
Run Code Online (Sandbox Code Playgroud)
GetDragDropString()只是一个函数,它返回要在Excel中删除的数据字符串.
sender只是我拖动的UI组件.像网格,编辑框,文本框等可以是任何一个.
谢谢你的帮助!
编辑:由于DragDrop.DoDragDrop在某些情况下返回有问题,也许有人可以帮助编写适当的超时?我已经尝试启动一个新的Thread并使其超时,这在简单的情况下工作,并且当线程中的工作不需要UI资源时.但是,当我调用DoDragDrop带有超时的新线程时,它会抛出一个异常,说线程无法访问该对象,因为另一个线程拥有它.所以我需要在同一个线程中调用这个函数.因此,当此函数在一定时间内无法返回时,我需要在UI线程上超时.
我知道我可以使用foreach循环,如下所示:
List<int> handles = GetHandles();
foreach (int handle in handles)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
SortedList我可以对 a执行以下操作吗?
SortedList<string, int> namesAndHandles;
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉,打错字了。它应该是一个SortedList. 本质上我想将其转换为 anIDictionary并根据名称访问句柄