분류 Python
?IronPython 에서 DirectX9 버전을 설치하면 아래와 같은 코드에서 문제가 발생합니다.
import clr
clr.AddReferenceByPartialName("System.Drawing")
clr.AddReferenceByPartialName("System.Windows.Forms")
clr.AddReferenceByPartialName("Microsoft.DirectX")
clr.AddReferenceByPartialName("Microsoft.DirectX.Direct3D")
from System.Windows.Forms import *
from Microsoft.DirectX import *
from Microsoft.DirectX.Direct3D import VertexFormats
from Microsoft.DirectX.Direct3D import CustomVertex
a = CustomVertex.TransformedColored.Format
b = VertexFormats.Transformed|VertexFormats.Diffuse
print type(a), a
print type(b), b
if a == b:
print "same"
else:
print "diff"
출력
<type 'VertexFormats'> Texture0, Transformed, Diffuse <type 'VertexFormats'> Texture0, Transformed, Diffuse Traceback (most recent call last): File C:\IronPython-1.0\test.ipy, line 18, in Initialize ValueError: Equal cannot be applied to Microsoft.DirectX.Direct3D.VertexFormats and Microsoft.DirectX.Direct3D.VertexFormats
Microsoft.Direct3D.?VertexFormats 을 Microsoft.Direct3D.?VertexFormats 에 적용하는데 실패했다는 이 말도 안되는 듯한 에러메시지는 ?IronPython 의 너무 엄격한 enum 처리 때문에 발생합니다.
이 버그의 좀더 구체적인 원인은 Microsoft .?NetFramework 1.1 과 2.0 의 DirectX 체계가 바뀌었기 때문에 발생합니다.
.NET Framework 1.1 에서 ?CustomVertex 는 Microsoft.DirectX.Direct3D 에 구조체로 존재하지만 2.0 에서 ?CustomVertex 는 별로 모듈로 독립이 되어있습니다. 물론 이름이 두개가 있을 경우 ?IronPython 은 충돌 처리를 내부 규칙에 의해 우선순위를 정해주는 루틴이 있긴 하지만 현재 같은 경우는 구조체와 모듈의 관계로 변한것이기 때문에 수습을 하지 못하고 Assert 에러를 발생해버립니다.
게다가 Microsoft.DirectX 란 이름의 1.1 버전 DirectX 와 2.0 버전의 DirectX가 동시에 존재하며 .NET Framework 의 clr.?AddReference 의 디폴트 작동은 상위 버전을 자동으로 읽도록 되어 있는 것으로 생각됩니다. (c# 에서는 직접 레퍼런싱을 해주기 때문에, 문제가 발생하지 않는 것으로 보입니다. )
이 문제로 인해 여러가지 자료형 문제가 발생하며 과거 98 시절 MFC DLL HELL 을 연상하게 하는 최악의 프레임워크 구조적인 문제가 발생합니다.
과거 MS 는 이문제를 해결하기 위해 COM 을 도입했지만, 결국 최종적인 해결책은 버전별로 버전을 붙이는 것(Direct3D7, Direct3D8, Direct3D9)으로 해결을 했던 경력이 있습니다. 아마 .NET Framework 에 대한 지나친 자신감 혹은 과거에 대한 망각을 해버린게 아닌가 싶습니다.
어쨌든 .NET Framework 의 훌륭한 설계로 인해서 해결은 가능합니다. 먼저 .NET ?FrameWork SDK 를 받아서 설치해야 합니다.
( C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0 )
clr.AddReferenceByPartialName("Microsoft.DirectX, Version=1.0.2902.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
?StrongName 을 사용하지 않고 단축명칭을 사용한 프로젝트는 문제가 발생할 가능성이 있으므로 ?AddReference 는 ?StrongName 을 쓰는것이 좋을듯 합니다.
| 제일 위로 |
| 최종 수정 일시: 09월 11일(2006년) 08:42 PM 편집 | 정보 | 차이 | 비슷한 페이지 DebugInfo |
| 유용한 페이지들: 분류 분류 | 자유로운 연습장 SandBox | 무작위 페이지들 RandomPages | 인기있는 페이지들 MostPopular |