我有一个32位的dll(在Matlab中为.Net编译,所以它是一个.Net dll)。我在64位机器上,只安装了32位MCR(Matlab编译器运行时)(我实际上已经安装了两个,但是两者都卸载了它们并重新安装了32位版本,以确保64位版本不会以某种方式干扰)。
我有一个我正在研究的解决方案,它有许多类库项目和一个Windows应用程序项目 - 主要的可执行文件。它被设置为“Any CPU”,“Prefer 32 bit”被检查,所有的库“任何CPU”(32位检查都不可用)。
我试图在其中一个类库中使用dll并遇到我在这里解释的问题Problems using Matlab compiled lib in .Net (32bit app on 64bit system)(当我尝试从dll调用类的构造函数时发生的错误消息是“尝试是为了加载一个格式不正确的程序。(HRESULT异常:0x8007000B)“)。
现在,这可能与“任何CPU”设置有关,我已经将使用dll和Windows应用程序项目的类库项目的“目标平台”更改为“x86”。它没有帮助。错误仍然存在!
所以,这里有一个解决方案,包括~20个类库(全部设置为任何CPU),我的类库使用dll(设置为x86)和Windows应用程序(设置为x86)。当我尝试调试我的应用程序时,它会引发异常。
现在我使用.Net 4.5在Visual Studio 2012中创建了一个新的测试解决方案,该解决方案包含两个项目:Windows应用程序和类库。我已经将dll的用法添加到类库中,并将两个目标平台都设置为x86,并且工作正常!没有例外。
我检查了输出页面,他们都加载了相同的dll - 我的dll(精确副本)和MWArray dll(来自GAC_32中的完全相同的位置)。并且调用完全相同的方法(来自我的dll的构造函数)。
现在,我的问题是,为什么它在我的测试解决方案中有效,而在另一个解决方案中却没有?有什么不同?从我在项目属性中检查的内容来看,它们完全相同!两个应用程序都是32位,它们的类库DLL是32位(我使用Exe64bitDetector应用程序对其进行了双重检查)。
而且,这是最奇怪的部分:
上面我谈的是调试。含义 - 按F5或单击开始调试。
如果我实际上是从磁盘手动运行程序(来自\ bin \ Debug文件夹),它可以正常工作!没有例外。但是,如果我使用“run without debugging”选项,它仍会抛出异常!
我通过制作这样的代码,仔细检查了没有异常的事实:
try
{
MyClassInstance = new MyClass();
System.IO.File.Create("APPLICATION.HAS.NOT.FAILED.LOL");
}
catch
{
System.IO.File.Create("APPLICATION.FAILED.LOL");
}
然后我检查bin \ Debug文件夹中出现了哪个文件。
那当然是在谈论主要的解决方案,在测试解决方案中,三个选项中的任何一个都可以正常工作。
这是什么?我和所有同事一样认真地缺乏想法。这里可以发生什么?我想在哪里试图解开这个谜团?