C# DLL问题导致强制转换异常

C# DLL问题导致强制转换异常,c#,exception,dll,casting,C#,Exception,Dll,Casting,我一直在将一个大型VS C#项目分解为几个较小的项目,虽然当它都是一个项目时一切都很好,但现在我已经将它分解了,所以我遇到了一个错误。尝试强制转换时会引发异常,尽管我没有更改任何代码。例外情况如下: 无效卡斯特例外 [A] MyApplication.MyProject.MyNamespace.Class不能强制转换为[B]MyApplication.MyProject.MyNamespace.Class。类型A源于“c:\WINDOWS\Microsoft.NET\Framework\v2.0

我一直在将一个大型VS C#项目分解为几个较小的项目,虽然当它都是一个项目时一切都很好,但现在我已经将它分解了,所以我遇到了一个错误。尝试强制转换时会引发异常,尽管我没有更改任何代码。例外情况如下:

无效卡斯特例外
[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”

如您所见,强制转换中的两种类型是相同的,唯一的区别是上下文和位置。名为GetHelperPage()的方法是问题的根源——它是外部应用程序中的外部方法。这通常不会是一个问题,除非外部应用程序随后调用此dll。方法如下所示:

[DllImport(“EpsComHelper.dll”,EntryPoint=“EPSCOMClientGetPage”,CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Ansi)]
私有静态外部int HelperGetPage(uint pClient、字符串sPage、StringBuilder sBuff、int nBuffSize)

此外部程序具有dll的正确路径:“C:\Source\view\Application\Version\core\bin\MyProgram.dll”。但是,VS正在将dll加载到它的临时文件中,并从那里运行它,正如上面异常中的路径所示。这使得它在两个相同的DLL中查找,这导致了错误。我在上看到了响应,但我的解决方案中没有ConfigurationManager.AppSettings[“DLL\u File\u Path”]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
redruttercore.dll!red地毯.Core.EpsInProcess.EpsConnector.ChangeLogLevel(string[]args={string[3]})行3727+0x1d字节
dotnebridge.DLL!。RunMethodInProcess(sbyte*szAssembly=0x035b7db4,sbyte*szFullyQualifiedName=0x08ebfcf4,sbyte*szClientPtr=0x0bccd26c,int nArgs=2,sbyte**arrArgs=0x0263190c)+0x43f字节
[本机到托管转换]
DotNetScriptPlugin.dll!034d9e5f()
ntdll.dll!7c827a29()
内核32.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()
[管理到本机转换]
redcore.DLL!red地毯.Core.EpsInProcess.EpsClient.GetPage(字符串s=“/sysinfo”)行318+0x1a字节

你会注意到dll在混乱中的某个地方被切换。开头带有大写字母的dll位于临时文件中,结尾带有小写字母的dll位于bin中。

当该程序通过HelperGetPage()调用外部程序时,该程序也会回调该dll。它的dll路径位于C:\Source\view\Application\Version\core\bin\MyProgram.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混淆。

当它通过HelperGetPage()调用外部程序时,该程序也会回调该dll。它的dll路径位于C:\Source\view\Application\Version\core\bin\MyProgram.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混淆