BUG: ´ë½Å MarshalDirectiveException TypeLoadException »ý¼º ¿©ºÎ

±â¼ú ÀÚ·á: 317007 - ÀÌ ¹®¼­°¡ Àû¿ëµÇ´Â Á¦Ç° º¸±â.
¸ðµÎ È®´ë | ¸ðµÎ Ãà¼Ò

ÀÌ ÆäÀÌÁö¿¡¼­

Çö»ó

P/Invoke ¸¦ »ç¿ëÇÒ ¶§ ÀϺΠ»óȲ¿¡¼­´Â MarshalDirectiveException ¿¹¿Ü ´ë½Å TypeLoadException ¿¹¿Ü°¡ »ý¼ºµË´Ï´Ù.

ÇöÀç »óÅÂ

Microsoft´Â ÀÌ ¹®¼­ÀÇ ½ÃÀÛ ºÎºÐ¿¡ ³ª¿­ÇÑ Á¦Ç°¿¡¼­ ¹®Á¦¸¦ È®ÀÎÇß½À´Ï´Ù.

Ãß°¡ Á¤º¸

MarshalAs Ư¼ºÀÇ µ¿ÀÛÀ» ºñ blittable Çü½ÄÀÇ Çʵå, ¸Å°³ º¯¼ö ¸¶¼£¸µ ÄÁÆ®·ÑÀ» »ç¿ëÇÒ ¼ö ¶Ç´Â ¹Ýȯ Çü½ÄÀÌ ÀÖ½À´Ï´Ù. MarshalAs Ư¼º¿¡ ÁöÁ¤ÇÑ °ü¸®µÇ´Â Çü½Ä¿¡ ´ëÇÑ Çã¿ëµÈ °ü¸®µÇÁö ¾Ê´Â Ç¥ÇöÀÌ ¾Æ´Ñ °ü¸®µÇÁö ¾Ê´Â Çü½ÄÀ» ÁöÁ¤ÇÏ´Â °æ¿ì, ·±Å¸ÀÓ ½Ã P/Invoke È£Ã⠽ñⰡ MarshalDirectiveException ¿¹¿Ü°¡ »ý¼ºµË´Ï´Ù. TypeLoadException ¿¹¿Ü °æ¿ì MarshalAs Áö½Ã¹®Àº Ŭ·¡½º Çʵ忡 »ç¿ëµË´Ï´Ù, Áö¿øµÇÁö ¾Ê´Â °ü¸®µÇÁö ¾Ê´Â Ç¥ÇöÀ» ÁöÁ¤ÇÏ´Â ´ë½Å »ý¼ºµË´Ï´Ù. ´ÙÀ½ »ùÇÿ¡¼­´Â bool ºÎ¿ï ¹× VariantBoolUnmanagedType ±¸¼º¿ø°ú °æ¿ì¿¡¸¸ ½ÖÀ¸·Î »ç¿ëÇÒ ¼ö ³ªÅ¸³»´Â MarshalDirectiveException ¿¹¿Ü¸¦ »ý¼ºÇØ¾ß ÇÕ´Ï´Ù.

Windows Mobile ±â¹Ý ½º¸¶Æ®Æù¿¡ GPRS ¿¬°áÀÌ ±¸¼ºµÇ¾î ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù

´ÙÀ½ Microsoft Visual C# »ùÇà Äڵ带 ½ÇÇàÇÒ ¶§ ÀÏ¹Ý ¿¹¿Ü catch ºí·Ï ´ë½Å MarshalDirectiveException catch ºí·ÏÀÌ ½ÇÇàµÉ À¯ÀÇÇϽʽÿÀ.
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public class TestStruct
{
        //This is the incorrect MarshalAs directive. 
	[MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.LPWStr, SizeConst=4)]
	public bool b;
}


public class Tester
{
	[DllImport("msvcrt.dll", EntryPoint="puts")]
	public static extern int puts_In(TestStruct ts);

	public static int Main()
	{
		int retVal = 0xAAAA; //Initializing to passing value.
		TestStruct ts = new TestStruct();
		ts.b = true;

		//testing puts_In
		try
		{
			puts_In(ts);
			retVal = 0;
		        Console.WriteLine("\nShould never get here");
			Console.WriteLine("No Exception!");
		}
		catch( MarshalDirectiveException e )
		{
			Console.WriteLine("\nputs_In case threw expected exception");
			Console.WriteLine(e.ToString() + "\n");	
		}
		catch( Exception e )
		{
			retVal = 0;
			Console.WriteLine("\nUnexpected Exception!"); 
			Console.WriteLine(e.ToString() + "\n");
		}

		Console.WriteLine((retVal==0xAAAA)?"PASSED!":"FAILED!");
		return retVal;
	}
}
				

ÂüÁ¶

ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ MSDN) Microsoft °³¹ßÀÚ ³×Æ®¿öÅ© (À¥ »çÀÌÆ®¸¦ ¹æ¹®ÇϽʽÿÀ.
interop ¸¶¼£¸µ
http://msdn.microsoft.com/en-us/library/04fy9ya1.aspx
MarshalAsAttribute Ŭ·¡½º
http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute(vs.71).aspx

¼Ó¼º

±â¼ú ÀÚ·á: 317007 - ¸¶Áö¸· °ËÅä: 2007³â 5¿ù 17ÀÏ ¸ñ¿äÀÏ - ¼öÁ¤: 6.6
º» ¹®¼­ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù.
  • Microsoft .NET Framework 1.0
  • Microsoft .NET Framework 1.1
Ű¿öµå:?
kbmt kbbug KB317007 KbMtko
±â°è ¹ø¿ªµÈ ¹®¼­
Áß¿ä: º» ¹®¼­´Â Àü¹® ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ °ÍÀÌ ¾Æ´Ï¶ó Microsoft ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î·Î ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù. Microsoft´Â ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ ¹®¼­ ¹× ±â°è ¹ø¿ªµÈ ¹®¼­¸¦ ¸ðµÎ Á¦°øÇϹǷΠMicrosoft ±â¼ú ÀÚ·á¿¡ ÀÖ´Â ¸ðµç ¹®¼­¸¦ Çѱ۷ΠÁ¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ±â°è ¹ø¿ª ¹®¼­°¡ Ç×»ó ¿Ïº®ÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. µû¶ó¼­ ±â°è ¹ø¿ª ¹®¼­¿¡´Â ¸¶Ä¡ ¿Ü±¹ÀÎÀÌ Çѱ¹¾î·Î ¸»ÇÒ ¶§ ½Ç¼ö¸¦ ÇÏ´Â °Íó·³ ¾îÈÖ, ±¸¹® ¶Ç´Â ¹®¹ý¿¡ ¿À·ù°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. Microsoft´Â ³»¿ë»óÀÇ ¿À¿ª ¶Ç´Â Microsoft °í°´ÀÌ ÀÌ·¯ÇÑ ¿À¿ªÀ» »ç¿ëÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â ºÎ Á¤È®¼º, ¿À·ù ¶Ç´Â ¼ÕÇØ¿¡ ´ëÇØ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. Microsoft´Â ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÚÁÖ ¾÷µ¥ÀÌÆ®Çϰí ÀÖ½À´Ï´Ù.

Çǵå¹é º¸³»±â