我开发了一个.NET程序集(.NET 4.0,强名称),它公开了两个服务组件.程序集(dll)应该托管在COM +应用程序中,并使用COM +属性(程序集和组件级别)进行修饰.例如,程序集级别属性:
//COM+ Attributes
[assembly: ApplicationID("MY_APP_GUID")] //GUID of the COM+ app
[assembly: ApplicationName("MyComPlusAppName")] //Name of the COM+ app
[assembly: ApplicationActivation(ActivationOption.Server)] //The app is hosted in it own dllhost process (out-of-process)
[assembly: ApplicationAccessControl(AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent, Authentication = AuthenticationOption.None, ImpersonationLevel = ImpersonationLevelOption.Delegate, Value = false)]
[assembly: Description("COM+ app description")]
Run Code Online (Sandbox Code Playgroud)
目前(开发原因),我一直在运行以下脚本来创建COM +应用程序并注册程序集(包含其所有组件):
%windir%\Microsoft.NET\Framework\v4.0.30319\RegSvcs.exe /appdir:"%CD%" MyComPlusAssembly.dll
Run Code Online (Sandbox Code Playgroud)
上面的批处理文件将根据程序集装饰属性创建(在单次运行中)COM +应用程序,在COM +应用程序中注册MyComPlusAssembly.dll文件并在其中注册所有ComVisible组件,因此所有内容都可见并在dcomcnfg中按预期配置.此命令还将生成一个全新的TLB文件.程序集是使用AnyCPU构建的,因此在x64版本的Windows上,dllhost.exe进程将以64位运行,而在x86版本的Windows上,它将以32位运行.另外,我的dll文件,应该不放在GAC(这就是为什么我使用Regsvcs.exe的命令行实用程序的/ APPDIR开关).使用上述批处理文件安装COM +程序集时,所有工作都按预期工作.
我开始为我的应用程序编写一个Wix(v3.6)部署项目,它应该做同样的事情,即:创建COM +应用程序,注册.NET程序集和所有ComVisible组件.请注意,这次我依赖于TLB文件随安装程序一起提供(*.msi).TLB由构建过程生成(VS 2010).为实现上述目的,我添加了以下Wix组件(受Wix COM +扩展文档的启发 - WixComPlusExtension):
<DirectoryRef Id="INSTALLDIR_SERVER">
<Component Id="cmp_MyComPlusAssembly.dll" Guid="COMPONENT_DLL_GUID">
<File Id="MyComPlusAssembly.dll" Name="MyComPlusAssembly.dll" DiskId="1" Source="..\install\$(var.Configuration)\Server\MyComPlusAssembly.dll" KeyPath="yes"/>
<CreateFolder> …Run Code Online (Sandbox Code Playgroud) 我在C#中开发了一个COM +组件,继承了ServicedComponent.这是它的样子:
[Transaction(TransactionOption.Required)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[EventTrackingEnabledAttribute(true)]
[JustInTimeActivation]
[ObjectPooling(Enabled = true, MinPoolSize = 10, MaxPoolSize = 30, CreationTimeout = 15000)]
[Synchronization]
class MyComponent: System.EnterpriseServices.ServicedComponent
{
[AutoComplete(true)]
public string getHello()
{//2nd breakpoint
ContextUtil.SetComplete();
return "HelloWorld";
}
}
Run Code Online (Sandbox Code Playgroud)
我有另一个测试项目,我称之为该组件.
class Program
{
static void Main(string[] args)
{
MyComponent myComp = new MyComponent();
myComp.getHello();//1st Breakpoint
}
}
Run Code Online (Sandbox Code Playgroud)
我无法达到第二个断点.这是在我切换到VS 2012之前的工作.奇怪的是,在切换到2012之后,它不再在VS 2010中工作了.
我已经试过了,
有人可以从这里指点吗?
更新1
从Mike给出的链接,我在DLL和PDB文件所在的同一文件夹中尝试了symchk for my DLL.它失败并显示PDB不匹配或未找到错误.我不知道如何解决这个错误.