첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

아래 코드는 닷넷 어셈블리 2.0 버전을 닷넷 4.5 프로젝트에서 사용하기 위해서 .config 파일을 설정하는 대신 코드로 설정하는 예제이다.

▶ RuntimePolicyHelper.cs

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// 런타임 정책 헬퍼
    /// </summary>
    public static class RuntimePolicyHelper
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Interface
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region CLR 런타임 정보 인터페이스 - ICLRRuntimeInfo

        /// <summary>
        /// CLR 런타임 정보 인터페이스
        /// </summary>
        [ComImport]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")]
        private interface ICLRRuntimeInfo
        {
            //////////////////////////////////////////////////////////////////////////////////////////////////// Method

            #region 버전 문자열 구하기 - xGetVersionString()

            /// <summary>
            /// 버전 문자열 구하기
            /// </summary>
            void xGetVersionString();

            #endregion
            #region 런타임 디렉토리 구하기 - xGetRuntimeDirectory()

            /// <summary>
            /// 런타임 디렉토리 구하기
            /// </summary>
            void xGetRuntimeDirectory();

            #endregion
            #region 로드 여부 구하기 - xIsLoaded()

            /// <summary>
            /// 로드 여부 구하기
            /// </summary>
            void xIsLoaded();

            #endregion
            #region 로드 가능 여부 구하기 - xIsLoadable()

            /// <summary>
            /// 로드 가능 여부 구하기
            /// </summary>
            void xIsLoadable();

            #endregion
            #region 에러 문자열 로드하기 - xLoadErrorString()

            /// <summary>
            /// 에러 문자열 로드하기
            /// </summary>
            void xLoadErrorString();

            #endregion
            #region 라이브러리 로드하기 - xLoadLibrary()

            /// <summary>
            /// 라이브러리 로드하기
            /// </summary>
            void xLoadLibrary();

            #endregion
            #region 프로시저 주소 구하기 - xGetProcAddress()

            /// <summary>
            /// 프로시저 주소 구하기
            /// </summary>
            void xGetProcAddress();

            #endregion
            #region 인터페이스 구하기 - xGetInterface()

            /// <summary>
            /// 인터페이스 구하기
            /// </summary>
            void xGetInterface();

            #endregion
            #region 디폴트 시작시 플래그 설정하기 - xSetDefaultStartupFlags()

            /// <summary>
            /// 디폴트 시작시 플래그 설정하기
            /// </summary>
            void xSetDefaultStartupFlags();

            #endregion
            #region 디폴트 시작시 플래그 구하기 - xGetDefaultStartupFlags()

            /// <summary>
            /// 디폴트 시작시 플래그 구하기
            /// </summary>
            void xGetDefaultStartupFlags();

            #endregion
            #region 레거시 버전 2 런타임 바인딩하기 - BindAsLegacyV2Runtime()

            /// <summary>
            /// 레거시 버전 2 런타임 바인딩하기
            /// </summary>
            [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
            void BindAsLegacyV2Runtime();

            #endregion
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 레거시 버전 2 런타임 성공적 이용 가능 여부 - LegacyV2RuntimeEnabledSuccessfully

        /// <summary>
        /// 레거시 버전 2 런타임 성공적 이용 가능 여부
        /// </summary>
        public static bool LegacyV2RuntimeEnabledSuccessfully { get; private set; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Static

        #region 생성자 - RuntimePolicyHelper()

        /// <summary>
        /// 생성자
        /// </summary>
        static RuntimePolicyHelper()
        {
            ICLRRuntimeInfo clrRuntimeInfo = (ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject
            (
                Guid.Empty, 
                typeof(ICLRRuntimeInfo).GUID
            );

            try
            {
                clrRuntimeInfo.BindAsLegacyV2Runtime();

                LegacyV2RuntimeEnabledSuccessfully = true;
            }
            catch(COMException)
            {
                LegacyV2RuntimeEnabledSuccessfully = false;
            }
        }

        #endregion
    }
}

 

▶ AudioPlayer.cs

※ 아래 소스 코드는 실행이 되지 않는 참조용 예제 코드이다.

namespace TestProject
{
    /// <summary>
    /// 오디오 플레이어
    /// </summary>
    public class AudioPlayer
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 오디오 엔진
        /// </summary>
        private IAudioEngine audioEngine;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Consturctor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - AudioPlayer()

        /// <summary>
        /// 생성자
        /// </summary>
        public AudioPlayer()
        {
            if(RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully)
            {
                this.audioEngine = new AudioEngine20();
            }
            else
            {
                this.audioEngine = new AudioEngine45();
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 재생하기 - Play(filePath)

        /// <summary>
        /// 재생하기
        /// </summary>
        /// <param name="filePath">파일 경로</param>
        public void Play(string filePath)
        {
            this.audioEngine.Play(filePath);
        }

        #endregion
    }
}
728x90
반응형
Posted by 사용자 icodebroker

댓글을 달아 주세요