我正面临一个非常模糊的问题,而我正试图在Windows中运行一个Java应用程序,并排(SxS).
我已经完成了创建java.exe.config和java.exe.manifest文件的所有准备工作,这些文件与JRE位于同一个文件夹中.
当我从命令行调用它时(通过启动.bat文件),应用程序正常运行..bat文件使用SxS配置的Java(这是我运行应用程序的框中唯一的一个)
但是,当我尝试从另一个Java进程(使用Runtime.getRuntime.exec()
)内部调用它时,或者ProcessBuilder
它似乎完全忽略了SxS配置,并且子Java进程抱怨它无法找到COM库,这就是我必须执行SxS的原因.我必须补充说,父Java流程也是由为SxS配置的Java.exe启动的.因此,我认为" Runtime.getRuntime(), ProcessBuilder()
"会给我Java SxS加载环境.
使用一些Windows工具(procexp.exe,procmon.exe)进行进一步调试我发现以下内容:当我从.bat文件启动应用程序时,.manifest文件通常由crss.exe读取(因为它应该是).但是,当Java生成另一个进程时,根本不考虑.manifest文件.我能想到的一个可能的问题是,启动进程的Java.exe的当前目录与java.exe.manifest文件所在的目录不同.
我唯一能想到的是java启动器中的错误/问题(或者他们称之为功能).
有没有人有类似的问题?任何人都可以对上述事项有所了解吗?非常感激.
到目前为止,我尝试过以下方法:
Runtime.getRuntime().exec(). DID NOT WORK
Runtime.getRuntime.exec()
ProcessBuilder
.不工作我们正在开发一个基于MFC的大型应用程序与少数托管(.NET)加载项的集成.与这些加载项的通信是通过COM完成的.
从历史上看,我们刚刚使用注册表将这些加载项(作为COM服务器)提供给应用程序.但是,现在我们正在尝试使用无注册的COM互操作来实现这一目标.
我们希望这些加载项能够与运行应用程序的目录位于一个单独的目录中 - 最好是在任何地方.但是,由于无法解析依赖程序集,我们显然遇到了服务器对象实例化的问题,这些程序集也存在于COM服务器DLL的目录中.
"老式"COM互操作在加载目标程序集时使用LoadFrom上下文来处理此问题.但激活上下文机制似乎并没有这样做.
有谁知道如何让这个工作?目前尚不清楚我们是否可以在模块的SxS清单中识别依赖程序集,或者我们是否可以以不同方式创建激活上下文?
感谢您的任何想法/提示!
杰夫
我已经构建了一个使用两个COM服务器dll的COM客户端应用程序; 我希望这个应用程序在没有COM注册的情况下运行 - 即:winsxs/.manifests
当我尝试从客户端应用程序创建COM对象的实例时,我得到了一个(...几乎可以预期......)"Class not registered"消息.
我之前已经成功完成了这种配置,但我无法弄清楚为什么这个配置失败了.
这里有一些细节:
我有的COM对象:
-
[
object,
uuid(262D00FB-3B9F-4A76-98FC-3051FDCAF0A6),
dual,
nonextensible,
helpstring("IDialogManager Interface"),
pointer_default(unique)
]
interface IDialogManager : IDispatch{
};
[
uuid(58562535-BCA5-4D04-BB92-78F90EDA201E),
//...
]
dispinterface _IDialogManagerEvents
{
};
[
uuid(D599D3F0-A4D1-44A7-87A9-16032CC613CA),
//...
]
coclass DialogManager
{
[default] interface IDialogManager;
[default, source] dispinterface _IDialogManagerEvents;
};
Run Code Online (Sandbox Code Playgroud)
-
-
[
object,
uuid(2A183A2E-A620-4E00-B657-C9D2E59201D4),
nonextensible,
helpstring("ICadWizardsManager Interface"),
pointer_default(unique)
]
interface ICadWizardsManager : IDispatch{
};
[
object,
uuid(FE97F3FB-8930-43BC-947D-64C90F45A071),
nonextensible,
helpstring("ICadWizard Interface"),
pointer_default(unique)
]
interface ICadWizard …
Run Code Online (Sandbox Code Playgroud) 我有一个令人烦恼的问题,我可能会以某种方式规避,但另一方面更愿意在它上面,并了解究竟发生了什么,因为看起来这个东西真的要留下来.
这是故事:我有一个简单的OpenGL应用程序可以正常工作:从来不是编译,链接或运行它的主要问题.现在我决定尝试将一些更密集的计算转移到工作线程中,以便可能使GUI更具响应性 - 当然,使用Boost.Thread.
简而言之,如果我在.cpp文件的开头添加以下片段:
#include <boost/thread/thread.hpp>
void dummyThreadFun() { while (1); }
boost::thread p(dummyThreadFun);
Run Code Online (Sandbox Code Playgroud)
,然后我开始得到"这个应用程序无法启动,因为没有找到MSVCP90.dll"尝试启动调试版本.(发布模式正常.)
现在使用Dependency Walker查看可执行文件,他也找不到这个DLL(我猜想这个),我可以看到我们正在寻找它以便能够调用以下函数:
?max@?$numeric_limits@K@std@@SAKXZ
?max@?$numeric_limits@_J@std@@SA_JXZ
?min@?$numeric_limits@K@std@@SAKXZ
?min@?$numeric_limits@_J@std@@SA_JXZ
Run Code Online (Sandbox Code Playgroud)
接下来,我尝试转换每个实例min
并max
使用宏,但可能找不到对它们的所有引用,因为这没有帮助.(我正在使用一些我没有源代码的外部库.但即使我能做到这一点 - 我认为这不是正确的方法.)
所以,我的问题 - 我猜 - 是:
我在Visual Studio 2008的一个非常简单的安装中首先使用它.然后尝试安装Feature Pack和SP1,但它们也没有帮助.当然也试过几次Rebuild.
我正在使用Boost的预构建二进制文件(v1.36.0).这不是我第一次在这个项目中使用Boost,但这可能是我第一次使用基于单独源的部件.
禁用增量链接无济于事.程序是OpenGL的事实似乎也不相关 - 我在将相同的三行代码添加到一个简单的控制台程序时遇到了类似的问题(但它在抱怨MSVCR90.dll _mkdir
,当我更换时)后者boost::create_directory
,问题消失!!).它实际上只是删除或添加这三行使程序运行正常或根本不运行.
我不能说我并排理解(甚至不知道这是否相关,但这是我现在所假设的),说实话,我也不是超级感兴趣 - 只要我可以构建,调试和部署我的应用程序......
编辑1:在尝试构建一个无论如何重现问题的精简示例时,我发现该问题与Spread Toolkit有关,Spread Toolkit的使用是我遇到此问题的所有程序的常见因素.(但是,在开始链接Boost之前我从来没有这样做.)
我现在想出了一个让我重现这个问题的最小程序.它由两个编译单元A.cpp和B.cpp组成.
A.cpp:
#include "sp.h"
int main(int argc, char* argv[])
{
mailbox mbox = -1;
SP_join(mbox, "foo");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
B.cpp:
#include …
Run Code Online (Sandbox Code Playgroud) 我需要部署同一个C#.NET项目的多个版本.项目输出是一个COM互操作程序集,用于本机应用程序.我遇到的问题是我必须并排部署这个程序集的几个版本,但无论我做什么似乎都没有创建不同的版本.相反,版本会互相覆盖.
我已经尝试更改程序集GUID,尝试更改程序集版本号,尝试重新生成程序集强名称密钥,尝试更改程序集标题和说明.为了版本控制,我宁愿不必为程序集中的各个类型更改GUID或名称.
我如何确保这些版本不会互相覆盖,并且我可以并排查看和部署它们?
提前致谢!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace InteropTest
{
[Guid("...")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Test
{
public Test()
{
}
public string Version
{
get
{
return "1.0";
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它使用隔离部署中的本机COM dll中的一些类.
简化:
在运行时,我将带有清单文件的dll下载到某个目录而不进行注册.
然后,我创建一个指向该目录的激活上下文,然后从dll创建类的实例.
让我们说创建A类并在B课之后.
在这个流程中一切顺利.
当我将我的应用程序更改为WinForm时,问题就出现了.当按下"按钮1"时,我像以前一样创建激活上下文,然后创建一个类A的实例.这很有效,流程返回到我的WinForm.但是当按下"按钮2"时,我无法创建B类.我得到一个异常,说无法找到该类!
所以似乎WinForm以某种方式弄乱了我的激活上下文.
这是为什么?那里发生了什么?
有办法解决吗?
几点说明:
我尝试使用sxstrace.exe执行激活上下文创建,但它仅记录我的激活上下文创建.
我试着评论出Application.EnableVisualStyles(),但它没有帮助.
如果我使用create和destroy激活上下文将每个调用包装到我的dll,它可以工作,但我自然不想去那里...
我正在使用 FireBreath 框架制作浏览器插件。大多数逻辑都是用 C# 编写的,为了从浏览器调用它,我做了一个 C++ 包装器。浏览器调用 C++ 本机代码,该代码调用“代理”托管 C++ 代码,该代码调用 C# 项目中的实际逻辑。
所以我有3个dll:
所有 3 个 dll 都安装到用户目录 (c:\Users\\AppData\Roaming\MyCompany\MyApp\1.0.0.0)
问题是浏览器不加载 C# dll。我使用 Side by Side 清单来声明依赖项。
我试图制作一个单独的清单文件来声明一个程序集:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/>
<file name="FirstDependency.dll"/>
<file name="SecondDependency.dll"/>
</assembly>
Run Code Online (Sandbox Code Playgroud)
并将此依赖项的链接添加到 head dll(本机 C++):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/>
</dependentAssembly>
</dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)
我也尝试直接在 …
我有一个.net应用程序调用COM组件(C++),后者又调用另一个在.NET中实现的COM对象.
此应用程序使用Windows SxS功能,不会注册任何COM组件.不是用C++编写的,也不是用.net编写的.
第一次调用C++ COM组件工作正常.但是当C++ COM组件调用.net组件时,它会因类未注册而失败.
我尝试使用清单文件创建一个小型C++应用程序,该文件调用.net组件并且它可以工作.似乎当流是.net - > COM NATIVE - > .NET COM时.然后SxS中断并且不起作用.
在查看Fusion Logs(程序集加载日志)时,我发现没有人甚至试图解析.NET COM程序集.
这个SxS场景是否应该起作用(我认为它确实有效)?如果是,那么我可以做错什么?
这些是我正在使用的清单文件.
.net应用程序的应用程序清单(作为资源嵌入):
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<file name="DotNetComConsumer.dll" hashalg="SHA1">
<comClass clsid="{44E69FC9-5EAF-4D57-8C09-430F703AD82F}" tlbid="{4F81C9C3-FDDF-48F6-BC25-6F8CD458EBE6}"/>
<typelib tlbid="{4F81C9C3-FDDF-48F6-BC25-6F8CD458EBE6}" resourceid="1" version="2.0" helpdir="" flags="HASDISKIMAGE"/>
</file>
<comInterfaceExternalProxyStub name="_Class1" iid="{5D41351A-440B-4175-9296-72D5EED83AA7}" tlbid="{4F81C9C3-FDDF-48F6-BC25-6F8CD458EBE6}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="application.sxs" version="1.0.0.0" />
</dependentAssembly>
</dependency>
</asmv1:assembly>
Run Code Online (Sandbox Code Playgroud)
application.sxs.manifest(常规文件):
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="application.sxs" version="1.0.0.0"/>
<dependency>
<dependentAssembly>
<assemblyIdentity name="PerformanceMonitor" version="10.0.0.9999" publicKeyToken="792843134cf0407a" processorArchitecture="msil"/> …
Run Code Online (Sandbox Code Playgroud) (我正在运行Windows7并使用Visual Studio 2010.)
我在.NET Azure项目中使用ClamAV,每当我运行clamd.exe时,无论是通过我的代码还是通过运行clamd.exe,我都会遇到并行错误.
在Visual Studio 2010中,我收到错误:
Win32Exception未处理应用程序无法启动,因为它的并行配置不正确.有关更多详细信息,请参阅应用程序事件日志或使用命令行sxstrace.exe工具
在事件查看器中,我得到:
"C:\ Users\pconerly\code\AntiVirus_source\WorkerRole\clamav\clamd.exe"的激活上下文生成失败.无法找到依赖程序集Microsoft.VC80.CRT,processorArchitecture ="x86",publicKeyToken ="1fc8b3b9a1e18e3b",type ="win32",version ="8.0.50727.6195".请使用sxstrace.exe进行详细诊断.
当我搜索"8.0.50727.6195"时,它引导我进入2005年的redist,所以我下载了它 http://www.microsoft.com/download/en/details.aspx?id=3387
重启后,我仍然遇到并排错误.另外,我认为redist安装程序没有完成它的安装 - 就像它看到Visual Studio 2010并说"哦,这已经足够好了,我不需要安装".我没有尝试卸载2010并使用2005,因为我的开发团队的其余成员正在使用VS 2010.
这是怎么回事?怎么解决这个问题?我已经准备好拔出头发了.
在 PowerShell 中运行此命令时出现错误:
Install-WindowsFeature -Name Web-Net-Ext -source D:\Sources\SxS
Run Code Online (Sandbox Code Playgroud)
Install-WindowsFeature :在指定服务器上添加或删除功能的请求失败。安装一个或多个角色、角色服务或功能失败。找不到源文件。
我读过的每篇文章和博客都说需要指定该路径。如何获得对该文件夹的引用?
我正在试图弄清楚如何处理我们项目的安装和部署,这是一个框架.通常,开发人员会安装框架,然后让他们的.Net应用程序引用我们的dll.
该框架有两个级别:
我想提供一个安装程序,将.Net程序集放在GAC中,并在WinSxS文件夹中安装本机程序集.到目前为止,我还没有找到有关安装SxS程序集的更多信息.我知道可以使用MSI完成,我想知道是否有人知道如何使用WiX或其他一些安装工具.
我相信使用Visual Studio安装项目无法做到这一点.
最近我们的客户遇到了一些 .dll 地狱问题,所以我想知道 SxS 安装所需的 .dll 和 .ocx 是否是一个好主意。我读到了它,并成功部署了我们的应用程序,至少它的一些依赖项是通过清单满足的,但它仍然是推荐的部署方式,还是过去几年的一种时尚,现在逐渐被放弃?
sxs ×13
com ×5
regfreecom ×4
.net ×3
c++ ×3
winsxs ×3
c# ×2
interop ×2
side-by-side ×2
boost ×1
deployment ×1
dll ×1
firebreath ×1
installation ×1
installer ×1
java ×1
npapi ×1
powershell ×1
vb6 ×1
windows ×1
winforms ×1
wix ×1