Tag: x86

枚举所有已安装的程序集版本(在GAC中)

是否可以使用C#枚举GAC中所有已安装的程序集版本? 例如,我有一个名为“My.Assembly”的程序集。 程序集可能有各种版本(“1.0.0.0”,“2.3.4.5”,“0.1.2.4”,…),可以针对各种平台(x86,x64,任何CPU)进行编译。 现在我需要一种方法来确定安装了哪个版本/平台。 我知道我可以枚举GAC中的目录,但这似乎是错误的。 应该有更好的方法来做到这一点。 背景我有一个启动器应用程序,用户在其中选择一个DLL。 启动程序从DLL中检索一些信息(不加载它),然后必须启动正确的托管C#应用程序来处理DLL。 DLL可以针对Win32或x64编译,暴露始终是相同的(平台无关的)接口。 我使用LoadLibrary函数在C#应用程序中加载DLL。 唯一的问题是该过程必须是匹配格式(x86或x64)。 可以而且应该为x86,x64和任何CPU编译C#应用程序。

“无法找到运行此应用程序的运行时版本”,适用于64位Windows上的32位应用程序

我正在开发一个32位WinForm应用程序(目标:.NET 3.5)。 我的客户端坚持将应用程序安装到“Windows \ System32 \ clientname”文件夹中并在启动时自动启动。 此外,应用程序必须是32位,所以我不能使用“任何CPU”。 我正在使用VS2010在Win7 x64下进行开发,并且安装了所有版本的.NET。 当我启动应用程序时,我收到消息“无法找到运行此应用程序的运行时版本”。 在Win7 x86上它没有问题。 它不是应用程序本身,我100%确定所有必需的框架都已安装。 我知道在x64系统上这个文件夹不能用于32位应用程序,但正如我所说:客户坚持并且不会让步。 在我明确告诉客户无法完成之前,我想探索所有选项。 我当然用Google搜索并搜索了这个好网站,但没有对我的特殊情况有所帮助。 我的应用程序生成另一个位于同一文件夹中的32位进程。 当然,在x64上也不起作用,但我通过使用“Wow64DisableWow64FsRedirection”解决了这个问题,然后将其复制到另一个位置以从那里启动它(工作正常)。 我完成了我的作业,但我找不到在x64和特定文件夹下启动主应用程序的解决方案。 有吗?

运行时C#知道是否正在使用32位或64位版本的COM接口

我想构建一个DLL类库,使用COM Interop,使用C#,目标ANY CPU,并将其注册为32位和64位接口。 我希望能够在运行时显示使用的接口 – 如果我使用的是32位版本或64位版本。 有任何想法吗?

由于格式不正确,加载程序集失败

我在一个非常大的Windows窗体.net(C#)应用程序上开发了几个程序集。 最初每个组件都是为Target Platfom“Any CPU”构建的。 由于x64机器上的Crystal Reports存在问题,我们必须为x86目标平台构建整个项目。 我重新开始为x86重建一些项目,它运行得很好。 但有一个我有问题,当我尝试在另一个程序集中使用它作为参考时,另一个不会加载它给出以下错误: 无法加载文件或程序集#MyAssembly#或其依赖项之一。 尝试加载格式不正确的程序。 在具有多个程序集的示例项目中使用Crystal进行游戏时,我发现当为不同的目标平台构建项目时会发生此错误。 但这不是这种情况。 我为X86构建了每个Project,并且无法弄清楚问题出在哪里。

Visual Studio:如何正确构建和指定x64和x86的配置和平台

使用:Visual Studio 2012 Professional和Ultimate以及所有最新更新 如何正确指定配置和平台以正确构建x86和x64。 Visual Studio,当您第一次创建Winforms应用程序时,会为您提供两个配置,Debug和Release,AnyCPU定义为平台。 如果您只针对一个平台,那么答案很简单,您可以转到Build | 配置管理器并选择其中一个平台,然后转到项目属性的构建页面并选择相同的平台(x86或x64)并瞧! 你结束了(说你想要x86) /bin/x86/Debug /bin/x86/Release 我有一个应用程序和多个依赖项目(DLL程序集)的解决方案。 由于VS Configuration Manager顶部有两个下拉列表,配置和平台,然后在项目级别有另一个配置和平台,我执行了以下操作: (在进一步打字之前,我认为整个设置很糟糕,但……) 我使用最顶层的下拉列表和为平台选择的混合平台创建了两个新配置Debug64和Release64。 我依次选择了四种主要解决方案配置中的每一种,然后将项目级别配置和项目级别平台设置为匹配,因此: Debug64 === Debug64, x64 Release64 === Release64, x64 Debug === Debug, x86 Release === Release, x86 然后我进入项目属性(Alt + Enter)构建页面,忽略平台并依次选择每个配置,然后设置目标处理器以匹配。 我将输出更改为以下内容: Debug64: /bin/x64/Debug Release64: /bin/x64/Release Debug: /bin/x86/Debug Release: /bin/x86/Release 默认情况下,Visual Studio使用顶级平台设置文件夹和配置名称以设置输出的最后部分。 如果我保存并关闭项目属性,那么一切似乎都很好。 我可以构建,并使用适当的文件夹。 当我在Visual Studio工具栏上切换解决方案配置时,问题就来了。 项目属性构建页面默认恢复到它想要的状态,即比如/ […]

依赖于C ++ / CLI的任何CPU依赖于本机C dll(c ++ / cli的任何cpu)

这是我的问题。 我在C#中包装一个C dll。 为此,我首先编写了一个C ++ / CLI包装器。 本机C库链接到C ++ / CLI包装器。 (C ++ / cli项目中的链接器属性)。 以下是它现在的组织方式: – 原生C .lib:x86和64bit。 1解决方案包含2个项目: 与本机C .lib链接的C ++ / CLI包装器项目 C#项目引用C ++ / CLI项目 我的问题来自于我需要C#来定位“任何CPU”。 但是此选项在C ++ / CLI中不可用,因为它直接编译为本机代码。 我解决这个问题的想法是: – 在x86中编译C ++ / CLI包装器,然后更改配置并编译为64位。 当它编译时,我想告诉它基于平台采取哪个dll。 即:如果在64位编译,链接64位本机C dll,否则如果x86,链接x86本机C. – 完成后,我应该能够在我的C#平台中拥有任何CPU目标。 在这里,我将不再引用我的C ++ / CLI包装器项目,而是基于目标平台引用所需的dll。 我的问题是: 如何告诉C ++ / CLI项目基于目标平台链接到哪个.lib? 如何告诉C#项目基于目标平台引用哪个C […]

使用非托管代码使用扩展名获取文件图标时,在x86系统上获取exception

我正在开发磁盘目录应用程序,它要求我使用从数据库中检索的文件扩展名来获取文件图标。 使用他们的扩展程序获取文件图标的代码在我的Windows 7 x64机器上使用任何CPU调试配置都可以正常工作,但是当我在调试配置中切换到x86时,我得到以下错误。 致命执行引擎错误 当我试图在任何CPU配置的Windows XP x86中运行该应用程序时,我得到以下错误。 尝试读取或写入受保护的内存。 这通常表明其他内存已损坏 当我删除下面的代码应用程序完美无缺。 我想使用下面的代码从扩展名获取文件图标。 是否有任何解决方法来使代码在x86系统上工作? 我发现这个代码来自如何在C#中获取常见的文件类型图标? 。 /// /// Contains information about a file object. /// struct SHFILEINFO { /// /// Handle to the icon that represents the file. You are responsible for /// destroying this handle with DestroyIcon when you no longer need it. /// public […]

正确的方法来检测CPU架构?

我正在尝试检测正确的cpu架构,以安装x86 msi或x64 msi文件。 如果我是对的,对于msi我需要os cpu架构 我不完全确定我的方式是否正确,因为我无法测试它。 你怎么看? private static string GetOSArchitecture() { string arch = System.Environment.GetEnvironmentVariable(“PROCESSOR_ARCHITECTURE”); string archWOW = System.Environment.GetEnvironmentVariable(“PROCESSOR_ARCHITEW6432”); if(archWOW != null && archWOW != “” && archWOW.Contains(“64”)) return “x64”; if(arch.Contains(“86”)) return “x86”; if (arch.Contains(“64”)) return “x64”; return “”; }

如果语句似乎正在评估,即使条件评估为false

昨晚工作到很晚,我们试图弄清楚为什么会出现问题。 如果不应该进行validation检查失败。 我们最终在这段代码中添加了一个print语句(从Reflector中反汇编,以便检查代码实际上是我们编写的代码): public static string Redacted(string name, DateTime lastModified) { long ticks = lastModified.Ticks; if ((ticks != (ticks – (ticks % 10000L))) && (lastModified != DateTime.MaxValue)) { Log.Debug(string.Format(“Last Modified Date = ‘{0}’. Ticks = ‘{1}’. TicksCalc = ‘{2}'”, lastModified.ToString(“dd/MM/yyyy hh:mm:ss.fff”), ticks, ticks – (ticks % 10000L))); 它打印(重新格式化): Last Modified Date = ’22/03/2011 12:16:22.000’. Ticks […]

.net框架错误(HRESULT 0x8007000B)

我有一个使用Visual Studio 2005在32位Windows XP机器上编写的C#应用​​程序。该应用程序在Windows XP机器上运行良好,但是当我尝试在64位Windows 7专业机器上运行它时,我得到以下对话框在启动时: 以下是详细信息的全文。 See the end of this message for details on invoking just-in-time (JIT) debugging instead of this dialog box. ************** Exception Text ************** System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) at ICSNeoCSharp.IcsNeoDll.icsneoTxMessages(Int32 hObject, IcsSpyMessage& pMsg, Int32 lNetworkID, Int32 lNumMessages) […]