C# 为64位系统创建安装程序时出现问题

C# 为64位系统创建安装程序时出现问题,c#,vsto,x86-64,C#,Vsto,X86 64,我正在从事一个c#+vsto项目。我们使用vsto创建和验证excel模板。 我最近发现了一件有趣的事情 在32位系统上,软件安装在 C:\程序文件 但是在64位系统上, 它安装在 C:\程序文件(x86) 当我尝试 案例一: 在64位系统上打开excel文件(在32位系统上创建)。 案例二: 在32位系统上打开excel文件(在64位系统上创建) 我在系统上遇到一个异常 这是因为各个DLL存储在不同的位置 因为32位是指 C:\程序文件 和64位是指 C:\程序文件(x86) 有什么方法可以强

我正在从事一个c#+vsto项目。我们使用vsto创建和验证excel模板。 我最近发现了一件有趣的事情

在32位系统上,软件安装在

C:\程序文件

但是在64位系统上, 它安装在

C:\程序文件(x86)

当我尝试

案例一: 在64位系统上打开excel文件(在32位系统上创建)。

案例二: 在32位系统上打开excel文件(在64位系统上创建)

我在系统上遇到一个异常

这是因为各个DLL存储在不同的位置

因为32位是指

C:\程序文件

和64位是指

C:\程序文件(x86)

有什么方法可以强制安装程序在64位系统的C:\Program Files中安装软件,而不是在C:\Program Files(x86)

有什么帮助吗


尊敬。

我不确定我是否完全理解了这个问题,但您能否使用System.Environment.is64位OperatingSystem来查看这是否是一个64位操作系统?

惯例是在64位系统上安装32位软件到
程序文件(x86)
。我认为你不想把你的32位软件安装到
程序文件中
——这会违反规则

至于修复方法是什么,我想知道为什么Excel认为您的DLL安装在
程序文件中。您是否可能在某处使用硬编码路径


从您对这个答案的评论来看,您似乎确实在对安装路径进行硬编码。这听起来在很多方面都可能是个问题。您已经发现了64位操作系统的问题,但是如果您的用户的系统驱动器是D怎么办?如果他们有本地化版本的Windows呢?例如,在德国,程序文件文件夹通常是
C:\program

从我收集到的关于如何部署VSTO插件的信息中,您只需编写一组注册表项,其中包括DLL所在位置的详细信息。我的猜测是,您当前已将此位置硬编码,您需要根据用户在安装VSTO时选择的位置更改安装程序以写入位置。

来自此注释


当我在32上安装应用程序时 bit系统并生成模板 将DLL的路径存储在 模板,但当我尝试打开它时 64位系统上的excel模板,它 搜索当前的DLL引用 在程序文件中,但DLL是 存在于程序文件(x86)中 文件夹和我得到一个例外,我希望 现在清楚了

听起来可能您没有正确使用VSTO,尽管可能有一种用法我不知道

对于典型的VSTO加载项,加载项在EXCEL“加载项”键下注册。不管它是64位还是32位,您仍然只注册了一个(适用的)

加载Excel时加载加载项,而不是加载特定模板时加载

加载模板时,加载项通常会监视文档加载,然后根据需要作出反应


我相信可以使用VSTO构建“每个文档”类型的加载项,但如果这样做,Excel将无法跨不同安装类型的Excel加载文档,这一点也不奇怪,因为它们不能自动兼容。

当我在32位系统上安装应用程序并生成模板时,它会在模板中存储DLL的路径,但当我尝试在64位系统上打开excel模板时,它会搜索程序文件中存在的DLL引用,但DLL存在于程序文件(x86)中文件夹和我得到了一个异常,我希望它现在清楚了。你应该使用.net中的特殊文件夹类来定位程序文件目录。即使将其放入
程序文件
,如果用户的系统驱动器是
D
,因此程序文件文件夹是
D:\Program Files
,也可能会失败。还有那些非英语安装的本地化名称呢。最佳做法是在安装时写一个注册表项,说明DLL文件的安装位置并从该位置加载。@David:Excel模板将如何从注册表中找到相应的DLL引用?@Sangram我不知道。我不知道VSTO。目前它是如何定位DLL的?如果它与COM外接程序类似,那么安装程序会将相应的注册表项写入刚刚复制VSTO DLL的位置。