代码之家  ›  专栏  ›  技术社区  ›  Dasmowenator

导致强制转换异常的DLL问题

  •  1
  • Dasmowenator  · 技术社区  · 15 年前

    我把一个大的VSC项目分解成几个小的项目,虽然当它都是一个项目的时候一切都很好,但现在我把它分解成了一个错误。当我尝试强制转换时会抛出一个异常,尽管我没有更改任何代码。例外情况如下:

    无效例外
    [A] MyApplication.MyProject.MyNamespace.Class不能强制转换为[B]MyApplication.MyProject.MyNamespace.Class。类型A源自“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\rc\78e25ad5\28e4b7d\assembly\dl3\877f6451\b808fef4\u 4e19cb01\MyProgram.DLL”上下文“Default”中的“MyProgram,Version=2.4.0.46,Culture=neutral,PublicKeyToken=null”。类型B源自“C:\Source\view\Application\Version\core\bin\MyProgram.dll”处上下文“LoadFrom”中的“MyProgram,Version=2.4.0.46,Culture=neutral,PublicKeyToken=null”。


    私有静态extern int HelperGetPage(uint pClient、String sPage、StringBuilder sBuff、int nBuffSize);

    此外部程序具有正确的dll路径:“C:\Source\view\Application\Version\core\bin\MyProgram.dll”。但是,VS正在将dll加载到它的临时文件中,并从那里运行它,您可以从上面异常中的路径看到这一点。这使得它在两个相同的DLL中查找,这导致了错误。我看到的反应是 Reflection and casting 但我没有 Assembly.LoadFrom(“path.dll”) 装配 加载自 或者在解决方案中根本没有提到dll的位置。我所能想到的是,这是不知何故正在幕后进行的VS,我找不到任何地方,我可以改变它。任何帮助都将不胜感激。

    错误的调用堆栈:

    RedCarpetCore.dll!RedCarpet.Core.EpsInProcess.EpsConnector.ChangeLogLevel(string[] args = {string[3]}) Line 3727 + 0x1d bytes
    DotNetBridge.DLL!<Module>.RunMethodInProcess(sbyte* szAssembly = 0x035b7db4, sbyte* szFullyQualifiedName = 0x08ebfcf4, sbyte* szClientPtr = 0x0bccd26c, int nArgs = 2, sbyte** arrArgs = 0x0263190c) + 0x43f bytes
    [Native to Managed Transition]
    DotNetScriptPlugin.dll!034d9e5f()
    ntdll.dll!7c827a29()
    kernel32.dll!77e6570a()
    MSVCR71.DLL!7c352d9b()
    MSVCR71.DLL!7c3531c5()
    MSVCR71.DLL!7c352e69()
    MSVCR71.DLL!7c36a582()
    MSVCR71.DLL!7c34f9a2()
    MSVCR71.DLL!7c34f9a2()
    MSVCR71.DLL!7c350135()
    MSVCR71.DLL!7c36a582()
    eprise.dll!01d15fa7()
    eprevent.dll!01e218f0()
    eprevent.dll!01e2ec73()
    eprise.dll!01ccf427()
    wcc200.dll!01c0a6c5()
    oleaut32.dll!77d04141()
    [Managed to Native Transition]
    RedCarpetCore.DLL!RedCarpet.Core.EpsInProcess.EpsClient.GetPage(string s = "/sysinfo") Line 318 + 0x1a bytes
    

    你会注意到动态链接库在混乱中的某个地方被切换。开头用大写字母的dll在临时文件中,结尾用小写字母的dll在bin中。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Dasmowenator    14 年前

    当它通过HelperGetPage()调用外部程序时,该程序也会调用回这个dll。它在C:\Source\view\Application\Version\core\bin\MyProgram.dll中有这个dll的路径,尽管它似乎在那里找到了正确的dll(就像在同名的同一个dll中一样),但实际上它并不是正确的dll。此bin中的dll是在该项目编译时生成的,但该dll在编译时会复制到主项目的bin中。正确dll的路径是C:\Source\view\Application\Version\Application\bin\MyProgram.dll。尽管dll是相同的,但它是从application\bin文件夹而不是core\bin文件夹运行的,因此外部程序必须访问该dll才能避免dll混淆。