ブログトップ 記事一覧 ログイン 無料ブログ開設

のねの日記 - human brain programing

2016-02-05

macのwindows10のvs2015でF11を押してもステップインできない。

| 16:30

macのvmware fusionでWindows10を動かし、VS2015のデバッグをしようとした。

ステップインをするためF11キーを押したら、macのデスクトップに切り替わってしまった。

ステップインできなかった。

macのキーボードのショットカットを外したところ、ステップインできるようになった。

Mac OS Tiger で、[Send Keys]オプションではなく F11?F12 をキーボードから "Windows モードで" 直接使用したい場合は、これらのキーからすべてのショートカットを削除する必要があります。 これには、Mac OS X で[System Preferences]>[Keyboard & Mouse]>[Keyboard Shortcuts]を選択し、F11 および F12 キーを無効化します。

KB Parallels: 仮想マシン内でファンクションキー F9?F12 が期待どおりに機能しません

2016-02-03

LPArrayとByValArrayの違い

| 09:43

ByValArrayは、SizeConst必須、ArraySubTypeオプション。

ByValArray	

When the MarshalAsAttribute.Value property is set to ByValArray, 
the SizeConst field must be set to indicate the number of elements in the array.

The ArraySubType field can optionally contain the UnmanagedType of the array elements
 when it is necessary to differentiate among string types. 

You can use this UnmanagedType only on an array that whose elements appear as fields in a structure.

LPArrayの場合:

managed => unmanagedは、マネージド配列から長さが決まる。

unmanaged => managedは、SizeConst,SizePAramIndexで決まる。

LPArray	

A pointer to the first element of a C-style array. 

When marshaling from managed to unmanaged code,
 the length of the array is determined by the length of the managed array. 

When marshaling from unmanaged to managed code, 
the length of the array is determined from the MarshalAsAttribute.SizeConst and MarshalAsAttribute.SizeParamIndex fields, 

optionally followed by the unmanaged type of the elements within the array 
when it is necessary to differentiate among string types.
UnmanagedType Enumeration (System.Runtime.InteropServices)

2016-02-02

CharMap

| 17:39

namespace SharpFont.Internal
{
	[StructLayout(LayoutKind.Sequential)]
	internal class CharMapRec
	{
		internal IntPtr face;
		internal Encoding encoding;
		internal PlatformId platform_id;
		internal ushort encoding_id;
	}
}
SharpFont/CharMapRec.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont
namespace SharpFont
{
	public sealed class CharMap
	{
		internal IntPtr Reference
		{
			get
			{
				return reference;
			}

			set
			{
				reference = value;
				rec = PInvokeHelper.PtrToStructure<CharMapRec>(reference);
			}
		}
	}
}
SharpFont/CharMap.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont

配列フィールドは ByValArray または SafeArray と組で使用してください。

| 14:05

LPArrayのところで、全て同じエラーになる。

LPArrayをByValArrayに変えると、動くようになる。

読みこむだけなら、これで問題なさそうに思える。

この感じの行があると、マーシャリングができないようだ。
[MarshalAs(UnmanagedType.LPArray, SizeConst = 4)]
型 'System.TypeLoadException' のハンドルされていない例外が mscorlib.dll で発生しました

追加情報:型 'SharpFont.TrueType.Internal.HoriHeaderRec' の
フィールド 'Reserved' をマーシャリングできません: 
無効なマネージ/アンマネージ型の組み合わせです。
配列フィールドは ByValArray または SafeArray と組で使用してください。
namespace SharpFont.TrueType.Internal
{
	[StructLayout(LayoutKind.Sequential)]
	internal class HoriHeaderRec
	{
		internal FT_Long Version;
		internal short Ascender;
		internal short Descender;
		internal short Line_Gap;

		internal ushort advance_Width_Max;

		internal short min_Left_Side_Bearing;
		internal short min_Right_Side_Bearing;
		internal short xMax_Extent;
		internal short caret_Slope_Rise;
		internal short caret_Slope_Run;
		internal short caret_Offset;

		[MarshalAs(UnmanagedType.LPArray, SizeConst = 4)]
		internal short[] Reserved;

		internal short metric_Data_Format;
		internal ushort number_Of_HMetrics;

		internal IntPtr long_metrics;
		internal IntPtr short_metrics;
	}
}
SharpFont/HoriHeaderRec.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont
 typedef struct  TT_HoriHeader_
  {
    FT_Fixed   Version;
    FT_Short   Ascender;
    FT_Short   Descender;
    FT_Short   Line_Gap;

    FT_UShort  advance_Width_Max;      /* advance width maximum */

    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */
    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */
    FT_Short   xMax_Extent;            /* xmax extents          */
    FT_Short   caret_Slope_Rise;
    FT_Short   caret_Slope_Run;
    FT_Short   caret_Offset;

    FT_Short   Reserved[4];

    FT_Short   metric_Data_Format;
    FT_UShort  number_Of_HMetrics;

    /* The following fields are not defined by the TrueType specification */
    /* but they are used to connect the metrics header to the relevant    */
    /* `HMTX' table.                                                      */

    void*      long_metrics;
    void*      short_metrics;

  } TT_HoriHeader;
FreeType-2.6.2 API Reference

配列フィールドは ByValArray または SafeArray と組で使用してください。

| 13:41

>	SharpFont.dll!SharpFont.PInvokeHelper.PtrToStructure<SharpFont.TrueType.Internal.HeaderRec>(System.IntPtr reference) 行 43
 	SharpFont.dll!SharpFont.TrueType.Header.Reference.set(System.IntPtr value) 行 205
 	SharpFont.dll!SharpFont.TrueType.Header.Header(System.IntPtr reference) 行 48
 	SharpFont.dll!SharpFont.Face.GetSfntTable(SharpFont.TrueType.SfntTag tag) 行 1665
 	Examples.exe!Examples.ExampleForm.listBoxFont_SelectedIndexChanged(object sender, System.EventArgs e) 行 93
 	[外部コード]	
型 'System.TypeLoadException' のハンドルされていない例外が mscorlib.dll で発生しました

追加情報:型 'SharpFont.TrueType.Internal.HeaderRec' の
フィールド 'Created' をマーシャリングできません: 
無効なマネージ/アンマネージ型の組み合わせです。
配列フィールドは ByValArray または SafeArray と組で使用してください。
namespace SharpFont.TrueType.Internal
{
	[StructLayout(LayoutKind.Sequential)]
	internal class HeaderRec
	{
		internal FT_Long Table_Version;
		internal FT_Long Font_Revision;

		internal FT_Long Checksum_Adjust;
		internal FT_Long Magic_Number;

		internal ushort Flags;
		internal ushort Units_Per_EM;

		[MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
		internal FT_Long[] Created;

		[MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
		internal FT_Long[] Modified;

		internal short xMin;
		internal short yMin;
		internal short xMax;
		internal short yMax;

		internal ushort Mac_Style;
		internal ushort Lowest_Rec_PPEM;

		internal short Font_Direction;
		internal short Index_To_Loc_Format;
		internal short Glyph_Data_Format;
	}
}
SharpFont/HeaderRec.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont

応用編

C#側から渡した文字列をC++側で編集して戻したり、バイナリデータをやりとりしたり、構造体や共用体のやりとり等も適当にゴニョゴニョしればできる(ry

配列については

[In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)]

みたくしてマーシャラにLPArray指定で配列である旨を知らしめ、さらにArraySubTypeで要素の型を教えてやる。

構造体や共用体についてはStructLayout属性とかFieldOffset属性でググればよろし。あとはこれらの組み合わせ。

C#事始め - 思うだけで学ばない日記

UnmanagedType.LPArray を指定したら「マーシャリングできません:無効なマネージ/アンマネージ型の組み合わせです。配列フィールドは ByValArray または SafeArray と組で使用してください。」と怒られた。

C# 構造体に配列を含む場合のマーシャリング

自動的なステップオーバーが発生

| 13:15

ステップイン要求により、プロパティまたは演算子の自動的なステップオーバーが発生しました。
この動作は[関数ステップイン]を選択するか、または[プロパティおよび演算子をステップオーバーする]チェックボックスをオフにすることによって実行される行のコンテき捨てメニューでオーバーライドできます。

今後も自動的なステップオーバーが発生したときに通知を受け取りますか?

ツール>オプション>デバッグ>全般で、”プロパティおよび演算子をステップオーバーする(マネージのみ)。

チェックボックスをオフにするとステップインできる。

プロパティおよび演算子へのステップ インを有効にするには

[ツール] メニューの [オプション] をクリックします。

[オプション] ダイアログ ボックスで、左側にあるボックスの [デバッグ] をクリックします。

[デバッグ] カテゴリが表示されない場合は、[すべての設定を表示] チェック ボックスをオンにします。

[全般] ボックスで、[プロパティおよび演算子をステップ オーバーする (マネージのみ)] チェック ボックスをオフにします。

[OK] をクリックします。

方法 : マネージ コード内のプロパティおよび演算子にステップ インする

マーシャリングできません: 無効なマネージ/アンマネージ型の組み合わせです。

| 11:22

以下の試しのコードを実行したところ、マーシャリングのエラーになった。

namespace Examples
{
	public partial class ExampleForm : Form
	{
		private void listBoxFont_SelectedIndexChanged(object sender, EventArgs e)
		{
			fontFace = new Face(lib,
					 Path.Combine(Path.GetFullPath(fontFolder),
					 (string)listBoxFont.SelectedItem));
			fontFace.SetCharSize(0, 62, 0, 96);

            SharpFont.TrueType.OS2 os2Table = 
		(SharpFont.TrueType.OS2)fontFace.GetSfntTable(SharpFont.TrueType.SfntTag.OS2); /* 試しのコード */

            pictureBoxText.Invalidate();
        }

スレッド 0x2e78 はコード 0 (0x0) で終了しました。
'Examples.vshost.exe' (CLR v2.0.50727: Examples.vshost.exe): 'D:\08_MyGitHub\SharpFont\Binaries\Examples\Debug\Examples.exe' が読み込まれました。シンボルが読み込まれました。
'Examples.vshost.exe' (CLR v2.0.50727: Examples.vshost.exe): 'C:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms.resources\2.0.0.0_ja_b77a5c561934e089\System.Windows.Forms.resources.dll' が読み込まれました。モジュールがシンボルなしでビルドされました。
'Examples.vshost.exe' (CLR v2.0.50727: Examples.vshost.exe): 'D:\08_MyGitHub\SharpFont\Binaries\Examples\Debug\SharpFont.dll' が読み込まれました。シンボルが読み込まれました。
'Examples.vshost.exe' (CLR v2.0.50727: Examples.vshost.exe): 'C:\WINDOWS\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' が読み込まれました。
シンボルの読み込みをスキップしました。
モジュールは最適化されていて、デバッグ オプションの [マイ コードのみ] 設定が有効になっています。

例外がスローされました: 'System.TypeLoadException' (mscorlib.dll の中)
    型 'System.TypeLoadException' のハンドルされていない例外が mscorlib.dll で発生しました
    追加情報:型 'SharpFont.TrueType.Internal.OS2Rec' のフィールド 

'panose' をマーシャリングできません: 無効なマネージ/アンマネージ型の組み合わせです。
    配列フィールドは ByValArray または SafeArray と組で使用してください。

プログラム '[0x1CA4] Examples.vshost.exe' はコード -1073740771 (0xc000041d) で終了しました。

OS2クラスは、以下のような内容。

namespace SharpFont.TrueType
{
	public class OS2
	{
		private IntPtr reference;
		private OS2Rec rec;

		internal OS2(IntPtr reference)
		{
			Reference = reference;
		}


		internal IntPtr Reference
		{
			get
			{
				return reference;
			}

			set
			{
				reference = value;
				rec = PInvokeHelper.PtrToStructure<OS2Rec>(reference); /* 構造体へ変換(マーシャリング)*/
			}
		}
	}
}
SharpFont/OS2.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont

namespace SharpFont
{
	public sealed class Face : IDisposable
	{
		public object GetSfntTable(SfntTag tag)
		{
			IntPtr tableRef = FT.FT_Get_Sfnt_Table(Reference, tag);

			if (tableRef == IntPtr.Zero)
				return null;

			switch (tag)
			{
				case SfntTag.Header:
					return new Header(tableRef);
				case SfntTag.HorizontalHeader:
					return new HoriHeader(tableRef);
				case SfntTag.MaxProfile:
					return new MaxProfile(tableRef);
				case SfntTag.OS2:
					return new OS2(tableRef);
				case SfntTag.Pclt:
					return new Pclt(tableRef);
				case SfntTag.Postscript:
					return new Postscript(tableRef);
				case SfntTag.VertHeader:
					return new VertHeader(tableRef);
				default:
					return null;
			}
		}
	}
}
||<	
></blockquote><


><blockquote cite="https://github.com/Robmaister/SharpFont/blob/e20f1a46a0832cea7e207eacd8fb46a46a4cdb64/Source/SharpFont/TrueType/SfntTag.cs#L33" title="SharpFont/SfntTag.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont"><
>|cs|
namespace SharpFont.TrueType
{
	public enum SfntTag
	{
		Header = 0,
		MaxProfile = 1,
		OS2 = 2,
		HorizontalHeader = 3,
		VertHeader = 4,
		Postscript = 5,
		Pclt = 6
	}
}
SharpFont/Face.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont

Faceクラス

| 10:59

namespace SharpFont
{
	public sealed class Face : IDisposable
	{
		private IntPtr reference;
		private FaceRec rec;
		private Library parentLibrary;

		public Face(Library library, string path, int faceIndex)
			: this(library)
		{
			IntPtr reference;
			Error err = FT.FT_New_Face(library.Reference, path, faceIndex, out reference);

			if (err != Error.Ok)
				throw new FreeTypeException(err);

			Reference = reference;
		}

Referenceは、プロパティ

	internal IntPtr Reference
		{
			get
			{
				if (disposed)
					throw new ObjectDisposedException("Reference", "Cannot access a disposed object.");

				return reference;
			}

			set
			{
				if (disposed)
					throw new ObjectDisposedException("Reference", "Cannot access a disposed object.");

				reference = value;
				rec = PInvokeHelper.PtrToStructure<FaceRec>(reference);
			}
	
SharpFont/Face.cs at master 揃 Robmaister/SharpFont

FaceRecクラス

namespace SharpFont.Internal
{
	[StructLayout(LayoutKind.Sequential)]
	internal class FaceRec
	{
		internal FT_Long num_faces;
		internal FT_Long face_index;

		internal FT_Long face_flags;
		internal FT_Long style_flags;

		internal FT_Long num_glyphs;

		internal IntPtr family_name;
		internal IntPtr style_name;

		internal int num_fixed_sizes;
		internal IntPtr available_sizes;

		internal int num_charmaps;
		internal IntPtr charmaps;

		internal GenericRec generic;

		internal BBox bbox;

		internal ushort units_per_EM;
		internal short ascender;
		internal short descender;
		internal short height;

		internal short max_advance_width;
		internal short max_advance_height;

		internal short underline_position;
		internal short underline_thickness;

		internal IntPtr glyph;
		internal IntPtr size;
		internal IntPtr charmap;

		private IntPtr driver;
		private IntPtr memory;
		private IntPtr stream;

		private IntPtr sizes_list;
		private GenericRec autohint;
		private IntPtr extensions;

		private IntPtr @internal;

		internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(FaceRec)); } }
	}
}
SharpFont/FaceRec.cs at e20f1a46a0832cea7e207eacd8fb46a46a4cdb64 揃 Robmaister/SharpFont