Tôi muốn truy cập các ứng dụng COM + được phân đoạn trên máy chủ từ xa. Tôi đã thử này:COM + kích hoạt trên máy chủ từ xa có phân vùng trong C#
using COMAdmin
using System.Runtime.InteropServices;
_serverName = myRemoteServer;
_partionName = myPartionName;
_message = myMessage;
ICOMAdminCatalog2 catalog = new COMAdminCatalog();
catalog.Connect(_serverName);
string moniker = string.Empty;
string MsgInClassId = "E3BD1489-30DD-4380-856A-12B959502BFD";
//we are using partitions
if (!string.IsNullOrEmpty(_partitionName))
{
COMAdminCatalogCollection partitions = catalog.GetCollection("Partitions");
partitions.Populate();
string partitionId = string.Empty;
foreach (ICatalogObject item in partitions)
{
if (item.Name == _partitionName)
{
partitionId = item.Key;
break;
}
}
if (!string.IsNullOrEmpty(partitionId))
{
moniker = $"partition:{partitionId}/new:{new Guid(MsgInClassId)}";
try
{
var M = (IMsgInManager)Marshal.BindToMoniker(moniker);
M.AddMsg(_message);
}
catch (Exception ex)
{
throw new Exception($"We can not use: {_partitionName} with Id {partitionId}. {ex.ToString()}");
}
}
else
{
throw;
}
}
else
//we don't have partitions and this will work
{
Type T = Type.GetTypeFromCLSID(new Guid(MsgInClassId), _serverName, true);
var M = (IMsgInManager)Activator.CreateInstance(T);
M.AddMsg(_message);
}
}
Vì vậy, khi chúng tôi là địa phương trên (remote) máy, phân vùng đang làm việc với biệt danh và Marshal.BindToMoniker. Nhưng khi tôi thử làm điều tương tự từ xa từ máy của mình, tôi gặp lỗi từ Marshal.BindToMoniker rằng Partitons không được bật. Bởi vì trên phân vùng máy của tôi không được kích hoạt.
Message = "COM+ partitions are currently disabled. (Exception from HRESULT: 0x80110824)"
Tôi có thể sử dụng Marshal.BindToMoniker để chạy trên máy chủ từ xa. Có điều gì đó tôi có thể thêm vào chuỗi biệt danh nghĩa
moniker = $"server:_server/partition:{partitionId}/new:{new Guid(MsgInClassId)}"
Câu hỏi của tôi là rất simular này: COM+ object activation in a different partition
Bạn có chắc chắn điều này không theo thiết kế? Thông báo lỗi có vẻ phù hợp với cài đặt của bạn. Bạn nên liên hệ với Microsoft tôi đoán. Ngoài ra, hãy kiểm tra điều này: https://social.technet.microsoft.com/Forums/windows/en-US/a601d45a-10c0-4da9-a424-d35afef22161/how-to-enable-windows-7-windows-8-com- phân vùng chức năng –
Tôi đoán bạn bằng cách nào đó phải kết hợp tên máy chủ vào biệt danh. Ngay bây giờ bạn chỉ sử dụng tên máy chủ để kết nối với danh mục trên máy chủ. Bạn không sử dụng nó để tạo đối tượng như bạn làm trong trường hợp bạn không sử dụng phân vùng. Vì vậy, bạn đang thực sự cố gắng tạo đối tượng trên máy cục bộ của mình nơi bạn không bật phân vùng. Giải pháp có lẽ không cho phép phân vùng cục bộ như được đề xuất bởi liên kết được cung cấp bởi @SimonMourier vì điều đó sẽ chỉ cho phép bạn tạo đối tượng cục bộ và đó có lẽ không phải là những gì bạn muốn ở đây. –
@MikaelEriksson Về lý thuyết có thể có. Trong thực tế, có vẻ như hiện tại có thể không được hỗ trợ. BindToMoniker được thực hiện với một cuộc gọi đến CreateBindCtx (nhận được một IBindCtx), MkParseDisplayName và cuối cùng là một BindMoniker. Bạn có thể tự thực hiện trình tự và thay vì sử dụng BindCtx mặc định (có cấu trúc BIND_OPTS), bạn có thể tự tạo một cấu trúc với cấu trúc BIND_OPTS2. Điều đó có một pServerInfo với thông tin máy chủ. Bây giờ thats phần tốt. Phần xấu từ tài liệu: class moniker hiện không tôn vinh cờ pServerInfo. Vì vậy, có vẻ như nó sẽ không hoạt động ngay bây giờ. – Uwe