121 lines
3.4 KiB
C#
121 lines
3.4 KiB
C#
|
/* ****************************************************************************
|
||
|
*
|
||
|
* Copyright (c) Microsoft Corporation.
|
||
|
*
|
||
|
* This source code is subject to terms and conditions of the Microsoft Public License. A
|
||
|
* copy of the license can be found in the License.html file at the root of this distribution. If
|
||
|
* you cannot locate the Microsoft Public License, please send an email to
|
||
|
* dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
|
||
|
* by the terms of the Microsoft Public License.
|
||
|
*
|
||
|
* You must not remove this notice, or any other, from this software.
|
||
|
*
|
||
|
*
|
||
|
* ***************************************************************************/
|
||
|
using System; using Microsoft;
|
||
|
|
||
|
|
||
|
#if !SILVERLIGHT // ComObject
|
||
|
|
||
|
using System.Diagnostics;
|
||
|
using System.Runtime.InteropServices.ComTypes;
|
||
|
using System.Text;
|
||
|
using System.Globalization;
|
||
|
using Marshal = System.Runtime.InteropServices.Marshal;
|
||
|
|
||
|
#if CODEPLEX_40
|
||
|
namespace System.Dynamic {
|
||
|
#else
|
||
|
namespace Microsoft.Scripting {
|
||
|
#endif
|
||
|
|
||
|
internal sealed class ComMethodDesc {
|
||
|
private readonly int _memid; // this is the member id extracted from FUNCDESC.memid
|
||
|
private readonly string _name;
|
||
|
internal readonly INVOKEKIND InvokeKind;
|
||
|
private readonly int _paramCnt;
|
||
|
|
||
|
private ComMethodDesc(int dispId) {
|
||
|
_memid = dispId;
|
||
|
}
|
||
|
|
||
|
internal ComMethodDesc(string name, int dispId)
|
||
|
: this(dispId) {
|
||
|
// no ITypeInfo constructor
|
||
|
_name = name;
|
||
|
}
|
||
|
|
||
|
internal ComMethodDesc(string name, int dispId, INVOKEKIND invkind)
|
||
|
: this(name, dispId) {
|
||
|
InvokeKind = invkind;
|
||
|
}
|
||
|
|
||
|
internal ComMethodDesc(ITypeInfo typeInfo, FUNCDESC funcDesc)
|
||
|
: this(funcDesc.memid) {
|
||
|
|
||
|
InvokeKind = funcDesc.invkind;
|
||
|
|
||
|
int cNames;
|
||
|
string[] rgNames = new string[1 + funcDesc.cParams];
|
||
|
typeInfo.GetNames(_memid, rgNames, rgNames.Length, out cNames);
|
||
|
if (IsPropertyPut && rgNames[rgNames.Length - 1] == null) {
|
||
|
rgNames[rgNames.Length - 1] = "value";
|
||
|
cNames++;
|
||
|
}
|
||
|
Debug.Assert(cNames == rgNames.Length);
|
||
|
_name = rgNames[0];
|
||
|
|
||
|
_paramCnt = funcDesc.cParams;
|
||
|
}
|
||
|
|
||
|
public string Name {
|
||
|
get {
|
||
|
Debug.Assert(_name != null);
|
||
|
return _name;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int DispId {
|
||
|
get { return _memid; }
|
||
|
}
|
||
|
|
||
|
public bool IsPropertyGet {
|
||
|
get {
|
||
|
return (InvokeKind & INVOKEKIND.INVOKE_PROPERTYGET) != 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool IsDataMember {
|
||
|
get {
|
||
|
//must be regular get
|
||
|
if (!IsPropertyGet || DispId == ComDispIds.DISPID_NEWENUM) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//must have no parameters
|
||
|
return _paramCnt == 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool IsPropertyPut {
|
||
|
get {
|
||
|
return (InvokeKind & (INVOKEKIND.INVOKE_PROPERTYPUT | INVOKEKIND.INVOKE_PROPERTYPUTREF)) != 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool IsPropertyPutRef {
|
||
|
get {
|
||
|
return (InvokeKind & INVOKEKIND.INVOKE_PROPERTYPUTREF) != 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal int ParamCount {
|
||
|
get {
|
||
|
return _paramCnt;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|