Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > 在.NET中使用DirectMusic
【标  题】:在.NET中使用DirectMusic
【关键字】:.NET,DirectMusic
【来  源】:http://www.cnblogs.com/kriss

在.NET中使用DirectMusic

Your Ad Here   们知道以往进行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文件声明函数差不多吧?嘿嘿,明天试试看^^ 不知道博客园的朋友们对这个问题有什么看法,希望可以共同交流^^

网页上面漂浮动的图片的javascript代码:【上一篇】
C#调用winmm.dll来放音乐的示例:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 我认为JSP有问题(下)
  • ARM指令结构
  • Excel在学籍管理中的应用
  • JSP发送邮件实例
  • 一个不错的Ajax/Web IDE
  • 配置iis和resin1.1
  • 《最后期限》之提纲挈领
  • Alpha Controls v3.44 (界面组件包)
  • 别让知识库成了垃圾桶
  • [小函数]:随机产生N位字符串
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.