Ответ 1
Интересно, что ни один из методов NameTranslate
не может быть вызван через dynamic
. У меня есть только теоретическое объяснение этого ниже.
AFAIK, когда .NET DLR имеет дело с объектами COM для вызова dynamic
, он пытается использовать библиотеку типа COM, если она доступна, а затем прибегает к IDispatch
. То, как оно отличается от Reflection, которое сразу же вызывает IDispatch
при использовании с COM-объектами.
Библиотека типа ActiveDS (C:\Windows\System32\activeds.tlb
), если смотреть с OleView, выглядит несколько плохо сформированной. Он включает в себя множество деклараций, не совместимых с автоматизацией, включая интерфейсы:
interface IPrivateDispatch;
interface ITypeInfo;
interface ITypeComp;
interface ITypeLib;
interface IPrivateUnknown;
Определение класса для NameTranslate
себя выглядит следующим образом:
[
uuid(274FAE1F-3626-11D1-A3A4-00C04FB950DC)
]
coclass NameTranslate {
[default] interface IADsNameTranslate;
interface IDispatch;
};
Необязательно (хотя и не запрещено) объявлять IDispatch
внутри coclass
.
Итак, я бы предположил, что такая библиотека типов и/или coclass
определение может запутать DLR в этом случае.
В качестве обходного пути вы можете импортировать его с помощью TlbImp.exe activeds.tlb
(что создаст кучу предупреждений), добавьте сборку промежуточных результатов в ваш проект и вызовите API напрямую. Это работает:
Type ntt = Type.GetTypeFromProgID("NameTranslate");
var nto = Activator.CreateInstance(ntt) as ActiveDs.IADsNameTranslate;
nto.Init(3, null);