Я хочу получить доступ к секционированным приложениям COM + на удаленном сервере. Я попытался это:COM + активация на удаленном сервере с разделами в 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);
}
}
Так что, когда мы локальны на (удаленном) машины, перегородки работают с прозвищем и Marshal.BindToMoniker. Но когда я пытаюсь сделать то же самое дистанционно с моей машины, я получаю сообщение от Marshal.BindToMoniker, что Partitons не включен. Потому что на моих машинных разделах не включен.
Message = "COM+ partitions are currently disabled. (Exception from HRESULT: 0x80110824)"
Как использовать Marshal.BindToMoniker для запуска на удаленном сервере. Является ли это то, что я могу добавить к строке прозвища т.е.
moniker = $"server:_server/partition:{partitionId}/new:{new Guid(MsgInClassId)}"
Моих вопросов очень Двойников к этому: COM+ object activation in a different partition
Вы уверены, что это не дизайн? Сообщение об ошибке соответствует вашим настройкам. Вы должны связаться с Microsoft, я думаю. Также проверьте это: https://social.technet.microsoft.com/Forums/windows/en-US/a601d45a-10c0-4da9-a424-d35afef22161/how-to-enable-windows-7-windows-8-com- partitions-function –
Думаю, вам почему-то нужно включить имя сервера в прозвище. Прямо сейчас вы используете только имя сервера для подключения к каталогу на сервере. Вы не используете его для создания объекта так же, как в случае, если вы не используете разделы. Таким образом, вы на самом деле пытаетесь создать объект на своем локальном компьютере, на котором у вас нет разрешенных разделов. Решение, вероятно, не должно включать локальные разделы, как предложено ссылкой, предоставленной @SimonMourier, потому что это позволит вам создать объект локально, и это, вероятно, не то, что вы хотите здесь. –
@MikaelEriksson В теории возможно возможно. На самом деле, похоже, в настоящее время может не поддерживаться. BindToMoniker реализуется с вызовом CreateBindCtx (получает IBindCtx), MkParseDisplayName и, наконец, BindMoniker. Вы можете реализовать последовательность самостоятельно, и вместо того, чтобы использовать BindCtx по умолчанию (который имеет структуру BIND_OPTS), вы можете создать его самостоятельно с помощью структуры BIND_OPTS2. У этого есть pServerInfo с информацией о сервере. Теперь это хорошая часть. Плохая часть документации: class moniker в настоящее время не соблюдает флаг pServerInfo. Похоже, что сейчас это не сработает. – Uwe