Click here to Skip to main content
15,881,740 members
Articles / Programming Languages / C#

Building .NET Coverage Tool

Rate me:
Please Sign up or sign in to vote.
4.94/5 (34 votes)
25 Aug 2009MIT8 min read 84.6K   2.3K   109  
This article is a walkthrough for building a .NET coverage tool
//
// MarshalDesc.cs
//
// Author:
//   Jb Evain (jbevain@gmail.com)
//
// (C) 2005 Jb Evain
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

namespace Mono.Cecil {

	using System;

	public class MarshalSpec {

		NativeType m_natIntr;
		IHasMarshalSpec m_container;

		public NativeType NativeIntrinsic {
			get { return m_natIntr; }
			set { m_natIntr = value; }
		}

		public IHasMarshalSpec Container {
			get { return m_container; }
			set { m_container = value; }
		}

		public MarshalSpec (NativeType natIntr, IHasMarshalSpec container)
		{
			m_natIntr = natIntr;
			m_container = container;
		}

		public virtual void Accept (IReflectionVisitor visitor)
		{
			visitor.VisitMarshalSpec (this);
		}

		public virtual MarshalSpec CloneInto (IHasMarshalSpec container)
		{
			return new MarshalSpec (m_natIntr, container);
		}
	}

	public sealed class ArrayMarshalSpec : MarshalSpec {

		NativeType m_elemType;
		int m_paramNum;
		int m_elemMult;
		int m_numElem;

		public NativeType ElemType {
			get { return m_elemType; }
			set { m_elemType = value; }
		}

		public int ParamNum {
			get { return m_paramNum; }
			set { m_paramNum = value; }
		}

		public int ElemMult {
			get { return m_elemMult; }
			set { m_elemMult = value; }
		}

		public int NumElem {
			get { return m_numElem; }
			set { m_numElem = value; }
		}

		public ArrayMarshalSpec (IHasMarshalSpec container) : base (NativeType.ARRAY, container)
		{
		}

		public override MarshalSpec CloneInto (IHasMarshalSpec container)
		{
			ArrayMarshalSpec spec = new ArrayMarshalSpec (container);
			spec.m_elemType = m_elemType;
			spec.m_paramNum = m_paramNum;
			spec.m_elemMult = m_elemMult;
			spec.m_numElem = m_numElem;
			return spec;
		}
	}

	public sealed class CustomMarshalerSpec : MarshalSpec {

		Guid m_guid;
		string m_unmanagedType;
		string m_managedType;
		string m_cookie;

		public Guid Guid {
			get { return m_guid; }
			set { m_guid = value; }
		}

		public String UnmanagedType {
			get { return m_unmanagedType; }
			set { m_unmanagedType = value; }
		}

		public string ManagedType {
			get { return m_managedType; }
			set { m_managedType = value; }
		}

		public string Cookie {
			get { return m_cookie; }
			set { m_cookie = value; }
		}

		public CustomMarshalerSpec (IHasMarshalSpec container) : base (NativeType.CUSTOMMARSHALER, container)
		{
		}

		public override MarshalSpec CloneInto (IHasMarshalSpec container)
		{
			CustomMarshalerSpec spec = new CustomMarshalerSpec (container);
			spec.m_guid = m_guid;
			spec.m_unmanagedType = m_unmanagedType;
			spec.m_managedType = m_managedType;
			spec.m_cookie = m_cookie;
			return spec;
		}
	}

	public sealed class SafeArraySpec : MarshalSpec {

		private VariantType m_elemType;

		public VariantType ElemType {
			get { return m_elemType; }
			set { m_elemType = value; }
		}

		public SafeArraySpec (IHasMarshalSpec container) : base (NativeType.SAFEARRAY, container)
		{
		}

		public override MarshalSpec CloneInto(IHasMarshalSpec container)
		{
			SafeArraySpec spec = new SafeArraySpec	(container);
			spec.m_elemType = m_elemType;
			return spec;
		}
	}

	public sealed class FixedArraySpec : MarshalSpec {

		private int m_numElem;
		private NativeType m_elemType;

		public int NumElem {
			get { return m_numElem; }
			set { m_numElem = value; }
		}

		public NativeType ElemType {
			get { return m_elemType; }
			set { m_elemType = value; }
		}

		public FixedArraySpec (IHasMarshalSpec container) : base (NativeType.FIXEDARRAY, container)
		{
		}

		public override MarshalSpec CloneInto (IHasMarshalSpec container)
		{
			FixedArraySpec spec = new FixedArraySpec (container);
			spec.m_numElem = m_numElem;
			spec.m_elemType = m_elemType;
			return spec;
		}
	}

	public sealed class FixedSysStringSpec : MarshalSpec {

		private int m_size;

		public int Size {
			get { return m_size; }
			set { m_size = value; }
		}

		public FixedSysStringSpec (IHasMarshalSpec container) : base (NativeType.FIXEDSYSSTRING, container)
		{
		}

		public override MarshalSpec CloneInto (IHasMarshalSpec container)
		{
			FixedSysStringSpec spec = new FixedSysStringSpec (container);
			spec.m_size = m_size;
			return spec;
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Software Developer (Senior)
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions