我一直在将一个大型的VS C#项目分解成更小的项目,虽然一切都工作得很好,但是我现在收到错误,因为我将它拆分了。虽然我没有更改任何代码,但是当我尝试演员时会抛出异常。例外情况如下:
InvalidCastException的
[A] MyApplication.MyProject.MyNamespace.Class无法强制转换为[B] MyApplication.MyProject.MyNamespace.Class。类型A源自'MyProgram,Version = 2.4.0.46,Culture = neutral,PublicKeyToken = null'在上下文'Default'位置'c:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ RC \ 78e25ad5 \ 28e4b7d \组件\ DL3 \ 877f6451 \ b808fef4_4e19cb01 \ MyProgram.DLL”。类型B源自位于'C:\ Source \ view \ Application \ Version \ core \ bin \ MyProgram.dll'的上下文'LoadFrom'中的'MyProgram,Version = 2.4.0.46,Culture = neutral,PublicKeyToken = null'。
如您所见,演员表中的两种类型是相同的,唯一的区别是上下文和位置。一个名为GetHelperPage()的方法是问题的根源 - 它是外部应用程序中的外部方法。除了外部应用程序然后回调到此dll之外,这通常不会成为问题。该方法如下所示:
[DllImport(“EpsComHelper.dll”,EntryPoint =“EPSCOMClientGetPage”,CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Ansi)]
private static 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看到了回复,但我没有 ConfigurationManager.AppSettings [“DLL_File_Path”] 或 Assembly.LoadFrom(“path.dll”)在我的解决方案事实上,解决方案中根本没有提到汇编或 LoadFrom 或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在临时文件中,小写字母末尾的dll是bin中的那个。
答案 0 :(得分:1)
当它通过HelperGetPage()调用外部程序时,该程序也会回调此dll。它在C:\ Source \ view \ Application \ Version \ core \ bin \ MyProgram.dll中有这个dll的路径,即使它似乎在那里找到了正确的dll(如同一个名字相同的dll) ,它实际上不是正确的DLL。该项目中的dll是在该项目编译时生成的,但该dll在编译时会被复制到主项目的bin中。正确的dll的路径是C:\ Source \ view \ Application \ Version \ application \ bin \ MyProgram.dll。即使dll是相同的,它也是从application \ bin文件夹而不是core \ bin文件夹运行的,所以这是外部程序必须访问的dll,以免引起dll混乱。