원격 서버의 파티션 된 COM + 응용 프로그램에 액세스하려고합니다. 나는이 시도했다 : 우리는 (원격) 시스템에 로컬 때C#의 파티션이있는 원격 서버에서 COM + 활성화
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가 있습니다. 이제는 좋은 부분입니다. 문서의 나쁜 부분 : 클래스 모니 커는 현재 pServerInfo 플래그를 사용하지 않습니다. 그래서 지금은 효과가 없을 것 같습니다. – Uwe