小编ryr*_*ich的帖子

VB.NET相当于VB6属性Item.VB_UserMemId = 0

我已经从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)

vb.net vb6 excel vba excel-vba

7
推荐指数
1
解决办法
654
查看次数

Assembly.LoadFile中的OutOfMemoryException

我对这个很难过.有时候,当我打电话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.

如果有人可以提供任何见解,那将非常感谢!!

vb.net com c++-cli out-of-memory system.reflection

6
推荐指数
0
解决办法
470
查看次数

在对Excel执行放置操作时,DragDrop.DoDragDrop不返回

我的应用程序有一个简单的功能,它连接到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线程上超时.

c# excel drag-and-drop

6
推荐指数
1
解决办法
561
查看次数

在两种类型的列表上使用 foreach 循环?

我知道我可以使用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并根据名称访问句柄

c# foreach list

1
推荐指数
1
解决办法
744
查看次数