저는 웹 사이트를 로컬 db와 연결하기 위해 C#으로 웹 서비스를 개발했습니다. 로컬 응용 프로그램 용 SDK는 COM 개체입니다. 나는 VB 코드 아래를 변환하는 방법에 대한 내 마음을 파괴하고 둘째 날은 C#을 동등한 (SDK 프로토콜에 주어진) :C#에서 IDispatch를 캐스팅하는 방법
System.Type objType = System.Type.GetTypeFromProgID("PERCo_S20_SDK.ExchangeMain");
dynamic comObject = System.Activator.CreateInstance(objType);
if (comObject.SetConnect("192.168.1.14", "211", "ADMIN", "") != 0)
{
//Could not connect to server!
}
XmlDocument dep_xml = new XmlDocument();
XmlDeclaration dep_xml_decl = dep_xml.CreateXmlDeclaration("1.0", "UTF-8", "yes");
XmlElement root = dep_xml.DocumentElement;
dep_xml.InsertBefore(dep_xml_decl, root);
XmlElement element = dep_xml.CreateElement(string.Empty, "documentrequest", string.Empty);
element.SetAttribute("type", "subdiv");
dep_xml.AppendChild(element);
comObject.GetData(dep_xml as IDispatch);
comObject.Disconnect();
로 :
XML_DOM := CreateOleObject('MSXML2.DOMDocument.3.0') as IXMLDOMDocumen
GetData(XML_DOM as Idispatch)
나는이 시도했다
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00020400-0000-0000-C000-000000000046")]
private interface IDispatch
{
[PreserveSig]
int GetTypeInfoCount(out int Count);
[PreserveSig]
int GetTypeInfo
(
[MarshalAs(UnmanagedType.U4)] int iTInfo,
[MarshalAs(UnmanagedType.U4)] int lcid,
out System.Runtime.InteropServices.ComTypes.ITypeInfo typeInfo
);
[PreserveSig]
int GetIDsOfNames
(
ref Guid riid,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)]
string[] rgsNames,
int cNames,
int lcid,
[MarshalAs(UnmanagedType.LPArray)] int[] rgDispId
);
[PreserveSig]
int Invoke
(
int dispIdMember,
ref Guid riid,
uint lcid,
ushort wFlags,
ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
out object pVarResult,
ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
out UInt32 pArgErr
);
}
하지만 오류 얻을
An exception of type 'System.ArgumentException' occurred in System.Dynamic.dll but was not handled in user code
Additional information: Could not convert argument 0 for call to GetData.
C#에서 IDispatch를 어떻게 캐스트해야합니까?
분명히 .NET XmlDocument 클래스를 사용하고 있으며 관리되지 않는 Flavor (MSXML2.DOMDocument.3.0)가 아닙니다. IDispatch로 변환 할 수 없습니다. 프로젝트> 참조 추가> COM 탭에서 "Microsoft XML, v3.0"을 선택하십시오. –
@HansPassant "Microsoft XML, v3.0"에 대한 참조가 추가되었습니다. 전달 매개 변수 부분은 무엇입니까? GetData (XML_DOM을 Idispatch로 사용)? –
'new MSXML2.DOMDocument30()'을 사용하여 객체를 생성합니다. 캐스트는 필요 없습니다. –