Vb.net Assembly.LoadFile中的OutOfMemoryException

Vb.net Assembly.LoadFile中的OutOfMemoryException,vb.net,com,c++-cli,out-of-memory,system.reflection,Vb.net,Com,C++ Cli,Out Of Memory,System.reflection,这件事让我很难堪。有时,当我调用Reflection.Assembly.LoadFile(“指向我的dll的路径”)时,它会抛出OutOfMemoryException StackTrace只显示: at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence) at System.Reflection.Assembly.LoadFile(String path) 并且没有InnerException

这件事让我很难堪。有时,当我调用
Reflection.Assembly.LoadFile(“指向我的dll的路径”)
时,它会抛出
OutOfMemoryException

StackTrace只显示:

at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)
at System.Reflection.Assembly.LoadFile(String path)
并且没有
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")
顺便说一下,我试图加载的引擎DLL是混合程序集(包含本机和托管C++)-不确定这是否重要

总之,使用procexp时,我注意到以标准方式打开我的应用程序,所有这些静态加载的DLL都可以正常加载。但是,如果我通过COM(通过Excel,
CreateObject(“具有上述代码的类的ProgID”)
)初始化该类,它将在engineDLL4周围抛出
OutOfMemoryException


如果有人能提供任何见解,我们将不胜感激

尝试使用上的“选项>显示可用和不可用区域”。尝试找出是否没有足够的连续空间来容纳.NET的内存区域和任何加载的程序集。您还可以尝试通过打开应用程序并使用“配置文件>开始配置文件…”来使用,并查看是否存在库加载错误。没有什么理由认为CLR欺骗了您,特别是考虑到您正在使用这种不适当的方式加载程序集。Assembly.LoadFile()的名称非常糟糕,他们应该选择loadDangerly()。始终使用LoadFrom(),这样您就不能多次加载同一程序集。@HansPassant-使用LoadFrom仍然会抛出OutOfMemoryException。您的计算机内存(也称为RAM)的容量是多少?我有这个问题之前,当我有较低的内存(即2GB),但由于我升级,我没有发现问题,直到现在。