Kriss Liu

击长空、博千里,笑慑鬼魅,坦荡万象。四海皆是可有作为,宇内必有余之归宿。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  们知道以往进行DirectX开发,都需要使用C++。因为DirectX本身及其SDK都是基于C++和COM+的。这在一定程度上阻碍了像我这样的低手研究DirectX。可是大家知道其实用VB也可以开发DirectX吗?是的,DX7和DX8其实都是有for Visual Basic Type Library的,一般是在system32目录下的dx7vb.dll或dx8vb.dll。这个类库其实对DirectX进行了一定的封装,使其接口更易编程。

  更令人激动的是,在DirectX 9.0的SDK中,我们已经可以直接使用.NET开发DirectX(这部分就是Managed DirectX)。这另一方面也说明了微软对.NET平台的重视。这样我们就可以充分利用.NET的各种特性、C#的简洁和强大,以及VS.NET的RAD和UI方面的支持,来快速开发小型的应用或游戏:)

  不过安装完DirectX 9.0 SDK,看Managed Code部分的帮助后你却会发现,这就是DirectX吗?Direct3D、DirectDraw、DirectInput、DirectPlay、DirectSound!?好像缺点什么。是的,没有DirectMusic。也就是说DirectX的托管代码部分尚未实现DirectMusic。

  欠缺DirectMusic的DirectX已经是不完整的了,尤其是开发游戏的时候,除非你只想让玩家听wav格式的音乐。以下是SDK中关于两者的说明。

DirectMusic is a much more full-featured API that offers a complete solution for most audio scenarios in games and other interactive applications. Despite its name, DirectMusic plays all kinds of sounds including nonmusical sound effects.

DirectSound is the API of choice for scenarios that require low-level management of hardware resources, such as games with many short sounds that must be played with the lowest possible latency and use of system resources.

  也就是说DirectSound一般只用来播放声音,例如wav。而DirectMusic提供的功能则更丰富,主要表现在音效和音乐上。包括我们常用的MIDI

  问题是我现在就是想用.NET做一个MIDI播放器……

  我想出的解决思路有3个:
  1、通过COM Interop  
  2、通过DX for VB Type Library
(但这样只能使用到DirectX 8.0)
  3、使用C++


  首先我们来看第种方法。
  想想以往我们要在.NET里使用COM DLL怎么办?比如我们要把浏览器做到WinForm里。简单。往工具箱添加新项,然后在COM 组件里选择Microsoft Web Browser就可以了。这其实是一个COM DLL。添加COM引用时,.NET会自动产生一个经过包装的Interop DLL。.NET是跟这个DLL打交道,而这个DLL再和原来的COM DLL打交道。这就是在.NET里使用COM DLL的一般方法。也可以通过.NET自带的工具产生Interop DLL。

  于是我找到DirectMusic的主文件,system32目录下的 DMusic.DLL。直接添加对 DMusic.DLL 的引用。
  “这不是有效的程序集或 COM 组件!”

  原来并不是所有DLL都可以被.NET引用的!至于原因,我们可以看看国外一位先生遇到的和我们一样的问题:
I've read somewhere that DMusic is a "pure" COM object so you could only use it in C++, and so far, that's quite correct. COM interop samples in MSDN always talked about having to reference the type library of the COM object into your project. DMusic, however, doesn't have a type library. All I have are the Header files (dmusici.h, etc.) which you could include in your typical C++ projects, of course, but not in C#. Adding a reference to dmusic.dll directly also didn't work.

  也就是说只有包含Type Library的DLL才能被.NET引用(不知道是不是这样的。。)


  我们再来看第个方法,使用DirectX for VB Type Library。
  其实.NET 1.1的SDK里就有一个关于使用DirectMusic的例子。不信你可以去看看下面的目录:
  SDK\v1.1\Samples\Technologies\Interop\Basic\DirectX\DirectMusic
  这个例子使用的就是 DxVBLib。


  第种方法,那就是实在没办法,只好用C++。但想必让我用VC++结合DirectMusic做个MIDI播放器,看来是没这时间精力了(C++Builder还有可能……)
  要么就用折中的办法,DirectMusic的这一部分,用Managed C++进行封装,然后用C#引用它,做界面部分。虽然这样看起来好像有点不伦不类,不过也是解决问题的一种方法。。


  最后还想到两种方法。一是MIDI部分不使用DirectMusic。我在网上看到了不少MIDI的.NET实现(例如:C# MIDI Toolkit )。还有就是我们一般在.NET里面调用系统API的时候,那些DLL(比如user32.dll)不也一样不是COM组件?我们不是通过添加引用来使用它们,而是直接在代码里用DllImport[]...这应该和C++里include一个header文件声明函数差不多吧?嘿嘿,明天试试看^^ 不知道博客园的朋友们对这个问题有什么看法,希望可以共同交流^^

posted on 2005-01-15 01:05  Kriss Liu  阅读(2283)  评论(4编辑  收藏  举报