我正在尝试在 C# 中开发一个组件,该组件将由 C++ 客户端在进程外调用和使用。为此,我试图将其实现为服务器激活的 ServicedComponent。
该组件如下所示:
[assembly: ApplicationName("Sample COM")]
[assembly: ApplicationID("3967FB64-686C-4F93-B866-B011FEE9A6AA")]
[assembly: AssemblyKeyFile("SampleCOM.snk")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: Description("Testing ServicedComponents")]
namespace SampleCOM
{
[ComVisible(true)]
public interface ICalculator
{
double Add(double first, double second);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("SampleCOM.Calculator")]
[Guid("AA12A3DA-51A2-4F3D-90FF-E7C00E77800D")]
public class Calculator : ServicedComponent, ICalculator
{
public double Add(double first, double second)
{
return first + second;
}
}
}
该代码编译良好(VS 2017),我可以使用以下方法注册它:
regsvcs /fc SampleCOM.dll
现在,我想看看它是如何工作的。为此,我使用的是旧的、良好的 VB6.0 代码:
Private Sub Command1_Click()
On Error GoTo ErrorHandler
Dim obj As SampleCOM.Calculator
Dim res As Double
Set obj = CreateObject("SampleCOM.Calculator")
res = obj.Add(1.2, 3.4)
MsgBox "Done " & CStr(res)
GoTo Cleanup
ErrorHandler:
MsgBox Err.Description
Cleanup:
Set obj = Nothing
End Sub
在这里我不能让它工作。CreateObject失败,客户端上出现Permission denied错误。如果我切换到库激活它工作正常,但我需要让它在进程外,所以server .
在事件日志中,我可以看到以下条目:
特定于应用程序的权限设置不会将具有 CLSID {AA12A3DA-51A2-4F3D-90FF-E7C00E77800D} 和 APPID {3967FB64-686C-4F93-B866-B011FEE9A6AA} 的 COM 服务器应用程序的本地激活权限授予用户 MYDOMAIN\ZUSER SID (S-1-5-21-126838783-1048989290-1062434389-134100) 从地址 LocalHost (Using LRPC) 运行在应用程序容器中的 SID 不可用 (Unavailable)。可以使用组件服务管理工具修改此安全权限。
我在DCOM Config下找不到相应的应用程序{3967FB64-686C-4F93-B866-B011FEE9A6AA}。
COM+ Applications下面只有Sample COM app 。但是在那里,我不确定应该改变什么才能使其正常工作。