惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - Kriss Liu

绕开 CoreLab.MySql 验证 如何通过活动目录(ADSI)修改IIS6中的 Web 服务扩展 XMLDOM/XMLHTTP的跨域访问和页面代理 关于如何让页面同时下载多个文件的尝试 - Kriss Liu - 博客园 Remoting中的线程与网络通信内幕初探 Remoting多个信道(Chennel)的注册问题 基于强名称签名的代码访问保护及其改进 利用命名管道(Named Pipe)向Flash Player模拟Flash媒体文件 多样、互动的WinForm UI设计与开发思路(Flash、Html等) WinForm中设计时与DesignMode的区别 ServU插件设计 如何在C#中直接操作C++结构体 .NET中Flags枚举的使用 最近的计划。。VOS和DataSetBrowser。。 看完《仙剑奇侠传》前20集的一点牢骚。。 一套可嵌入或独立使用的翻页控件: WebPager(附源码) ASP.NET 2.0 中创建DataList子类控件时的一个错误 我与电脑的十年 关于 Windows Media DRM 0xC00D2840 错误
在.NET中使用DirectMusic
Kriss Liu · 2005-01-15 · via 博客园 - 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文件声明函数差不多吧?嘿嘿,明天试试看^^ 不知道博客园的朋友们对这个问题有什么看法,希望可以共同交流^^