




已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
跨平臺軟件的開發(fā)方式2007年04月15日 星期日 09:48原創(chuàng):smalltalk隨著經(jīng)濟和技術的發(fā)展,全球化進程的加速,特別是互聯(lián)網(wǎng)的發(fā)展和普及,為軟件提供了一個世界范圍的運行環(huán)境,當一個軟件發(fā)布到Internet上面時,這個軟件很可能瞬間在全世界就被人使用。從軟件開發(fā)商的角度來看,同時具有跨平臺和全球化特性的軟件能夠最大限度的占有市場;從自由軟件開發(fā)團體和個人來看,開發(fā)的軟件不但能夠運行在多種操作系統(tǒng)下,而且還能夠以不同的語言版本運行,全世界用戶都可以使用,這本身就符合自由和開放的追求。由于這些因素,跨平臺技術和全球化技術一直是軟件業(yè)研究和發(fā)展的重要課題。開發(fā)跨平臺軟件和全球化軟件的最大目的是為了爭取更多的用戶,獲得更大的市場??缙脚_軟件能夠在多個不同類型的操作系統(tǒng)下運行,它從操作系統(tǒng)層次拓寬軟件的用戶群體;全球化軟件是既具有國際化特性又進行了本地化處理的軟件,這樣,世界上不同國家和地區(qū)的用戶都能以自己熟悉的語言和習慣來使用該軟件。具有跨平臺特性的全球化軟件是非常有“魅力的”,它能夠吸引到更多的潛在用戶。由于跨平臺和國際化兩者都是特別廣泛的概念,不同的軟件架構(gòu)、不同的開發(fā)語言,采用的方法各不相同,為了做到不以偏概全,本篇文章將主要針對那些采用C/C+語言進行開發(fā)的、并準備添加或者已經(jīng)具有跨平臺特性的、同時還需要全球化的軟件。文章為開發(fā)者在設計和實現(xiàn)這類軟件時提供一些指導性意見,給出一些針對跨平臺軟件實施全球化的方法,并提出了一種采用跨平臺資源文件和模塊配合的解決方案和具體實現(xiàn)。*什么是跨平臺軟件跨平臺軟件技術在過去的十幾年來逐步發(fā)展,特別是當個人計算機(PC & MAC)性能的提高,LINUX操作系統(tǒng)的出現(xiàn),JAVA語言的推出,呈現(xiàn)出跳躍發(fā)展的趨勢。目前不但很多著名的自由軟件項目提供跨平臺的自由軟件,而且很多專業(yè)的軟件廠商也將他們的產(chǎn)品向不同的平臺移植。在發(fā)展的歷程中,跨平臺軟件技術也逐步形成規(guī)范,但由于平臺固有的異質(zhì)性,在進行跨平臺軟件開發(fā)時,往往在軟件的功能、效能與移植性等之間,要做適當?shù)臋嗪猓容^難整理出一般性的、與平臺及工具種類無關的法則。什么是跨平臺軟件,簡單講就是至少可以運行在兩個不同操作系統(tǒng)平臺下的軟件,完成相同或者相似的功能,而且這個軟件的可執(zhí)行程序來自與一份源代碼。*跨平臺軟件的開發(fā)方式跨平臺軟件的開發(fā)方式大體有三種,第一種是先在一個基準平臺上開發(fā)好,然后再移植到其他的操作系統(tǒng);第二種是采用的跨平臺模塊組合;第三種是采用虛擬機技術,利用平臺無關的語言進行開發(fā)。1. 移植第一種開發(fā)方式是比較傳統(tǒng)的做法,也是一直被廣泛采用的方式。這種做法也稱為軟件移植(Porting),即把在一種操作系統(tǒng)下運行的軟件通過改寫部分代碼,移植到另外一種或多種操作系統(tǒng)下運行。軟件最初的設計、編碼以及移植時使用的工具,這些決定了移植的代價。如果軟件在最初的設計、編碼時沒有考慮到以后的移植,大量采用了平臺相關的技術和平臺相關框架庫進行編碼,對這些代碼移植將付出極高的代價。一種極端的情況是最初使用的開發(fā)語言不能跨平臺的,以后要對這個軟件進行移植,將不得不更換開發(fā)語言重新編寫全部代碼,還要進行全新的測試,這樣的軟件在移植時是異常困難的。1.1. 宏定義軟件的代碼,從跨平臺的角度來看,可以分為平臺相關的和平臺無關的。采用C/C+編寫的軟件,在進行移植時,平臺無關的的代碼基本上不需要做大的改動,但平臺相關的代碼需要做很大的調(diào)整。這里所說的平臺包括操作系統(tǒng)和編譯器,為了能夠做到讓編譯器在編譯時根據(jù)當前的平臺狀況來自動選擇需要編譯的代碼,我們一般需要用C/C+的編譯宏指令來實現(xiàn)。舉個例子,下面的一段代碼是得到系統(tǒng)當前的時間并且格式化成字符串的操作,注意其中宏指令#ifdef #else#endif的使用。這段代碼可以在Win32、Linux和大多數(shù)Unix平臺通過編譯:#include ;#include ;#ifdef WIN32#define LOCALTIME_R(t) localtime(t)#define SNPRINTF _snprintf#else#define LOCALTIME_R(t) localtime_r(t), (struct tm *)&tmres)#define SNPRINTF snprintf#endifchar * getcurrentdate(char *buffer, unsigned int buflen) if (buffer) struct tm *tmnow; time_t long_time; time(&long_time ); /* Get time as long integer. */ tmNow = LOCALTIME_R( &long_time ); /* Convert to local time. */ SNPRINTF(buffer, buflen, %.4d-%.2d-%.2d %.2d:%.2d:%.2d, tmnow -;tm_year+1900, tmnow -;tm_mon + 1, tmnow -;tm_mday, tmnow -;tm_hour, tmnow -;tm_min, tmnow -;tm_sec); return buffer;研究一下上面的代碼我們可以發(fā)現(xiàn),由于一些庫函數(shù)是非ANSI標準的,平臺間有些差異,比如獲得格式化字符串的函數(shù)在Win32平臺叫_snprintf,而在Unix/Linux平臺叫snprintf,它們之間的差別不是太大,通過使用編譯宏指令就可以區(qū)分。1.2. 編譯環(huán)境識別在C/C+編譯器編譯源碼時,為了能夠識別當前環(huán)境的狀況,這包括編譯器的類型和版本,操作系統(tǒng)的類型和版本,計算機CPU的類型,機器內(nèi)部的字節(jié)順序等,每種編譯器內(nèi)部一般規(guī)定了一些常用的宏定義,利用這些定義就可以區(qū)分出當前的編譯環(huán)境了。如果我們開發(fā)的軟件需要在很多不同的平臺很編譯器上編譯,這時候環(huán)境就比較復雜了,這個時候如果我們能夠?qū)⒕幾g環(huán)境的宏定義轉(zhuǎn)換成我們自己內(nèi)部的約定,然后全部使用內(nèi)部的約定來處理宏,這會簡化我們進行跨平臺移植的操作。舉例來說,下面的一段代碼可以區(qū)分目前多種常用的編譯環(huán)境:#ifndef _ENV_MACROS_H_#define _ENV_MACROS_H_/* _ENV_I386 Intel i386/i486/Pentium (little endian)* _ENV_ALPHA Compaq/Digital Alpha (little endian)* _ENV_SPARC Sun Sparc* _ENV_HPPA HP PA-RISC* _ENV_MIPS MIPS* _ENV_PPC PowerPC* _ENV_POWER POWER Processors.* _ENV_MSVCPP Microsoft Visual C+ compiler; version* _ENV_WIN 32 or 64 bit Windows* _ENV_WINNT Windows NT* _ENV_WIN32 32 bit Windows* _ENV_WIN64 64 bit Windows* _ENV_UNIX UNIX* _ENV_SOLARIS SUN Solaris* _ENV_LINUX Linux* _ENV_HPUX HP UNIX* _ENV_AOSF Digital UNIX/Tru64 UNIX* _ENV_AIX IBM AIX* _ENV_IRIX SGI IRIX* _ENV_OS390 IBM OS/390* _ENV_AS400 IBM OS/400, AS/400* _ENV_MACOS Macintosh* _ENV_GNUC GNU C/C+ compiler; major version* _ENV_HP_ACC HP aC+ compiler; version* _ENV_SUNPRO Sun Pro/Workshop/Forte compiler; version (_ENV_SUNPRO_CC)* _ENV_SUNPRO_CC Sun Pro/Workshop/Forte CC compiler; version* _ENV_SUNPRO_C Sun Pro/Workshop/Forte C compiler; version* _ENV_SUN_SPARC Sun Sparc compilation mode* _ENV_SUN_SPARC32 Sun Sparc 32-bit compilation mode* _ENV_SUN_SPARC64 Sun Sparc 64-bit compilation mode* _ENV_SUN_I386 Sun i386 compilation mode* _ENV_AOSF_CC Compaq C+ compiler for Tru64; version* _ENV_INT64_NATIVE Compiler provides a 64-bit integer (not supported yet)* _ENV_64BIT_NATIVE defined for 64 bit platforms (not supported yet)* _ENV_CSET IBM AIX xlC, xlc, etc. this may be in old version.* _ENV_IBMC IBM AIX c compiler,xlc, cc.* _ENV_IBMCPP IBM AIX cpp compiler, xlC.* _ENV_MVSCPP IBM OS390 c+, cxx.* _ENV_MIPSPRO_CC SGI IRIX C* _ENV_BIG_ENDIAN_ARCH Defined if big-endian architecture* _ENV_LITTLE_ENDIAN_ARCH Defined if little-endian architecture* _ENV_SYSCALL _stdcall on Windows* _ENV_DECLSPEC_DLLEXPORT _declspec(dllexport) for VC+; empty otherwise* _ENV_DECLSPEC_DLLIMPORT _declspec(dllimport) for VC+; empty otherwise*/*/* Operating system / platform */*/* Windows platforms */#if (defined(WIN32) | defined(_WIN32) | defined(WIN64) | defined(_WIN64) | defined(_WIN32_)#define _ENV_WIN#if (defined(WIN32) | defined(_WIN32) | defined(_WIN32_)#define _ENV_WIN32#elif (defined(WIN64) | defined(_WIN64)#define _ENV_WIN64#endif#ifdef _WIN32_WINNT#define _ENV_WINNT#endif/* Alpha OSF / Tru64 / Digital UNIX */#elif (defined(_osf_)#define _ENV_AOSF#define _ENV_UNIX/* SUN Solaris - assumed */#elif (defined(_sun)#define _ENV_SOLARIS#define _ENV_UNIX/* IBM AIX */#elif (defined(_AIX)#define _ENV_AIX#define _ENV_UNIX /* AIX4.2 supports UNIX95, AIX4.3 supports UNIX98 */* SGI IRIX */#elif (defined(IRIX)#define _ENV_IRIX#define _ENV_UNIX/* IBM OS390 */#elif (defined(_MVS_)#define _ENV_OS390#define _ENV_UNIX /* OS/390 V2R2 UNIX95, OS/390 V2R7 UNIX98 */#elif (defined(EXM_OS390)#define _ENV_OS390#define _ENV_UNIX/* IBM AS400 */#elif (defined(_OS400_)#define _ENV_AS400#define _ENV_UNIX/* Macintosh */#elif (defined(macintosh)#define _ENV_MACOS/* Linux */#elif (defined(_linux_)#define _ENV_LINUX#define _ENV_UNIX/* HP Unix */#elif (defined(_hpux)#define _ENV_HPUX#define _ENV_UNIX/* Else */#else#warning Unknown platform!#endif/*/* Compiler */*/#if (defined(_MSC_VER) /* Microsoft Visual C+ */#define _ENV_MSVCPP _MSC_VER#elif defined(_BORLANDC_)#define _ENV_BORC /* Borland C/C+ */#elif defined(_WATCOMC_)#define _ENV_WATCOMC /* watcom c/c+ */#elif (defined(_GNUC_) /* GNU Project */#define _ENV_GNUC _GNUC_#elif (defined(_SUNPRO_CC) | defined(_SUNPRO_C) /* SUN Pro/Workshop/Forte */#define _ENV_SUNPRO _SUNPRO_CC#ifdef _SUNPRO_CC#define _ENV_SUNPRO_CC _SUNPRO_CC#endif#ifdef _SUNPRO_C#define _ENV_SUNPRO_C _SUNPRO_C#endif#elif (defined(_HP_aCC) /* HP aCC */#define _ENV_HP_ACC _HP_aCC#elif (defined(_xlC_) /* IBM C SET */#define _ENV_CSET _xlC_#elif (defined(_IBMC_) /* IBM c compiler */#define _ENV_IBMC _IBMC_#elif (defined(_IBMCPP_) /* IBM c+ compiler */#define _ENV_IBMCPP _IBMCPP_#elif (defined(_ENV_IRIX) | defined(_sgi)#define _ENV_MPISPRO_CC#elif (defined(_MVS_) & defined(_cplusplus) /* OS390 c+ compiler */#define _ENV_MVSCPP#elif (defined(EXM_OS390) & defined(_cplusplus) /* OS390 c+ compiler */#define _ENV_MVSCPP#elif (defined(_OS400_)#elif (defined(_DECCXX_VER) /* Compaq C+ */#define _ENV_AOSF_CC _DECCXX_VER#else#warning Unknown compiler!#endif/*/* Processor architecture */*/#if (defined(_ENV_MSVCPP)#ifdef _M_IX86 /* i386 architecture */#define _ENV_I386#endif#ifdef _M_ALPHA /* Alpha architecture */#define _ENV_ALPHA#endif#elif (defined(_ENV_SUNPRO)#ifdef _sparc /* Sparc architecture - 32-bit compilation mode */#define _ENV_SPARC#define _ENV_SUN_SPARC#define _ENV_SUN_SPARC32#endif#ifdef _sparcv9 /* Sparc architecture - 64-bit compilation mode */#define _ENV_SPARC#define _ENV_SUN_SPARC#define _ENV_SUN_SPARC64#endif#ifdef _i386 /* I386 architecture */#define _ENV_I386#define _ENV_SUN_I386#endif#elif (defined(_ENV_AOSF_CC)#ifdef _alpha /* Alpha architecture */#define _ENV_ALPHA#endif#elif (defined(_ENV_GNUC)#if (defined(_alpha) | defined(_alpha_)#define _ENV_ALPHA#elif (defined(_i386_)#define _ENV_I386#elif (defined(_sparc)#define _ENV_SUN_SPARC32#elif (defined(_hppa_)#define _ENV_HPPA#elif (defined(_mips_)#define _ENV_MIPS#elif (defined(_PPC_)#define _ENV_PPC#else#warning Unknown processor architecture!#endif#elif (defined(_ENV_HP_ACC)#if defined(_hppa)#define _ENV_HPPA#endif#elif (defined(_mips) | defined(_mips_) | defined(_MIPS_)#define _ENV_MIPS#elif (defined(_ENV_AIX)#if defined(_POWER)#define _ENV_POWER#endif#elif (defined(_ENV_MACOS)#define _ENV_PPC#elif (defined(_ENV_OS390)|defined(_ENV_AS400)#define _ENV_POWER#else#warning Unknown processor architecture!#endif/*/* Endian-ness */*/#if (defined(_ENV_I386) | defined(_ENV_ALPHA)#ifndef _ENV_LITTLE_ENDIAN_ARCH#define _ENV_LITTLE_ENDIAN_ARCH#endif /* _ENV_LITTLE_ENDIAN_ARCH */#ifdef _ENV_BIG_ENDIAN_ARCH#undef _ENV_BIG_ENDIAN_ARCH#endif /* _ENV_BIG_ENDIAN_ARCH */#else /* Sparc, etc. */#ifndef _ENV_BIG_ENDIAN_ARCH#define _ENV_BIG_ENDIAN_ARCH#endif /* _ENV_BIG_ENDIAN_ARCH */#ifdef _ENV_LITTLE_ENDIAN_ARCH#undef _ENV_LITTLE_ENDIAN_ARCH#endif /* _ENV_LITTLE_ENDIAN_ARCH */#endif /* Little-endian architectures */* TBD: How the hell do I detect endian-ness of HPPA machines, or is it transparent to the program? */*/* Miscellaneous macros */*/#if (defined(_ENV_MSVCPP)#define _ENV_DECLSPEC_DLLEXPORT _declspec(dllexport)#define _ENV_DECLSPEC_DLLIMPORT _declspec(dllimport)#define _ENV_SYSCALL _stdcall#define _ENV_DECLSPEC_DLLEXPORT_MID#elif defined(_ENV_OS390)#define _ENV_DECLSPEC_DLLEXPORT #define _ENV_DECLSPEC_DLLIMPORT #define _ENV_SYSCALL #define _ENV_DECLSPEC_DLLEXPORT_MID _Export#else /* not _ENV_MSVCPP */#define _ENV_DECLSPEC_DLLEXPORT#define _ENV_DECLSPEC_DLLIMPORT#define _ENV_SYSCALL#define _ENV_DECLSPEC_DLLEXPORT_MID#endif /* _ENV_MSVCPP */#endif /* _ENV_MACROS_H_ */以上的代碼將原來編譯器各自的環(huán)境宏轉(zhuǎn)換成統(tǒng)一的以_ENV_開始的宏定義,可以區(qū)分當前編譯器的類型、操作系統(tǒng)類型、系統(tǒng)內(nèi)部字節(jié)順序和計算機CPU類型等信息。有了這些信息,可以在移植代碼和跨平臺編碼時方便地使用平臺相關的特性。1.3. 定義通用的數(shù)據(jù)類型在目前的大多數(shù)計算機系統(tǒng)中,基本的數(shù)據(jù)類型在字節(jié)長度上基本一致,比如int類型占4個字節(jié),char類型占1個字節(jié)等,但有些基本的數(shù)據(jù)類型還是有差別的,比如float、double和64位的整數(shù)類型,不同的平臺還是有些差別的,為了方便進行跨平臺的編程,定義一個通用的數(shù)據(jù)類型可以簡化花費在數(shù)據(jù)類型上的時間。1.4. 利用平臺交叉工具移植隨著個人計算機性能的提高,目前比較先進的PC處理能力已經(jīng)不比采用Unix操作系統(tǒng)平臺的工作站差,蘋果機(Mac)的速度也在成倍增長,最快Power Mac G5系列已經(jīng)的采用了主頻在2GHz以上的RISC 處理器。在這樣的情況下,將原來在Unix平臺上運行的軟件下移到PC和Mac已經(jīng)成為可能,這可以大大降低該軟件的硬件平臺的投資;同樣,將PC或Mac上軟件上移到Unix平臺,可以充分發(fā)揮Unix平臺的處理能力,更加有效地利用Unix平臺,這同樣也重要意義。在這樣的背景下,有一些專業(yè)研究跨平臺開發(fā)技術的公司和社會團體針對特定的應用推出了各種軟件移植的解決方案,運用這些工具可以大大減少移植的代價。1.4.1. 從Unix/Linux到WindowsCygwin是Cygwin公司(/)的產(chǎn)品,它提供了Windows操作系統(tǒng)下的一個UNIX環(huán)境,它可以幫助程序開發(fā)人員把應用程序從UNIX/Linux移植到Windows平臺,是一個功能強大的工具集。 Cygwin由仿真層和一組工具組成,cygwin1.dll:它作為UNIX的一個仿真層,提供UNIX API功能; Cygwin工具負責創(chuàng)建一個UNIX或Linux的外觀界面。 Cygwin可以在Windows CE以外,Windows 95以上的所有非beta版本的Windows OS下工作,如Windows 98、Windows 2000、Windows XP等。 在Cygwin提供的仿真環(huán)境下,提供經(jīng)過移植的Gcc編譯器,很多原來在Unix/Linux上用Gcc編譯的軟件可以不加修改地在Windows下編譯并運行,這極大地方便了軟件從Unix到Window的移植,特別是一些開發(fā)原碼的項目。NuTCRACKER是MKS公司(/)的產(chǎn)品,它為開發(fā)人員在Windows下提供了一個Unix的環(huán)境,用戶可以方便地將Unix/Linux上使用X server、多線程程序移植到Windows平臺下運行。img/forum/uploadfile/untitled_71551072874798.jpg/img MKS Toolkit企業(yè)開發(fā)版可以不僅可以開發(fā)、移植和部署非圖形化的Unix應用程序和腳本程序,而且還可以移植原來使用X Windows, OpenGL。在安裝好NuTCRACKER平臺后,用戶甚至可以直接使用Visual C+集成環(huán)境來編譯來自Unix/Linux上的代碼。直接將Unix上的代碼拿到Windows下編譯執(zhí)行,這大大地節(jié)省了移植的成本。1.4.2. 從Windows到Unix/LinuxWind/U是bristol公司(/)開發(fā)的產(chǎn)品,它提供了一種將Win32程序順利地移植到Unix和Linux操作系統(tǒng)方法。它在Unix和Linux系統(tǒng)上實現(xiàn)了Win32的API以及MFC框架,而且比較穩(wěn)定。通過它提供的庫和工具,可以十分方便地將Win32上使用API和MFC的軟件移植到各種Unix和Linux系統(tǒng)中,大大節(jié)省移植的代價,由于它是一種商業(yè)產(chǎn)品,品質(zhì)有保證,目前已經(jīng)被很多公司采用。下圖是Wind/U的系統(tǒng)結(jié)構(gòu):img/forum/uploadfile/untitled_34751072874963.jpg/img目前Wind/U已經(jīng)可以很方便地支持從Win32到Solaris、HP-UX、AIX和RedHat Linux的移植。Visual MainWin 是 MainSoft(/)公司的產(chǎn)品,它也提供了從Win32程序代碼直接生成Unix/Linux程序的方法。Visual MainWin 是一個企業(yè)級的移植和跨平臺開發(fā)軟件,它可以利用Visual C+集成環(huán)境來編寫程序,然后將它們部署到多種的Unix平臺中,并生成本地執(zhí)行程序。它由兩部分組成,Visual MainWin SDK和Visual MainWin 運行庫, SDK是一個安裝在Visual Studio中的跨平臺插件,這個插件可以配合運行庫來生成高可靠性的Unix平臺代碼。下圖是Visual MainWin的使用框圖:最新的Visual MainWin 5甚至可以移植.net框架和MFC7的應用程序到Unix平臺。 2. 跨平臺模塊采用跨平臺模塊來組合開發(fā)跨平臺軟件,實際上是采用了組件的思想來進行跨平臺軟件的開發(fā)。這種方法目前正在被廣泛采用,特別適用與具有跨平臺需求的新產(chǎn)品開發(fā)中。在新的軟件產(chǎn)品進行設計時就考慮到跨平臺的需求,將軟件按功能分成多個可組合的模塊,定義好需求,然后由多個模塊小組獨立完成單個模塊的,并完成在目標平臺上的測試,同時的項目整合小組利用開發(fā)好的模塊,組合成產(chǎn)品。由于各個模塊都是跨平臺設計的,所以整合時的跨平臺問題會大大減少,這樣可以在很短時間內(nèi)推出一個產(chǎn)品的多個平臺的運行版本。模塊的思想非常有利于軟件的復用,一般情況下,規(guī)?;?jīng)營的軟件公司的產(chǎn)品大都形成系列化,各軟件間的都有功能交叉的部分,采用模塊化的思想,將這些部分獨立出來,交由專門的小組負責維護和升級,讓各產(chǎn)品組有更多的精力放在產(chǎn)品功能的更新上,有利于公司的整體效率的提高。如果一個公司的產(chǎn)品大多是跨平臺的產(chǎn)品,那么組成專門的跨平臺模塊組是非常合適的??缙脚_模塊一般的要求也比較復雜,一般都要在三個典型的基準平臺是Win32、Linux和Solaris。如果公司的產(chǎn)品還要支持Apple公司的平臺,還的加上MacOS。由于平臺的多樣性,造成了跨平臺模塊開發(fā)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年礦物原藥項目建議書
- 2025年血漿膽紅素吸附器項目發(fā)展計劃
- 聯(lián)營合同范本
- 2025年固體堿項目可行性研究報告
- 游藝項目合作合同范本
- 資金用途合同范本
- 箏樂作品的傳承與創(chuàng)新
- 掛面合同買賣合同范本
- 基于U-net的高壓直流輸電干擾事件自動檢測技術研究
- FAdV-4 Fiber-1 knob晶體結(jié)構(gòu)解析及其與細胞受體CAR相互作用的研究
- 2023年副主任醫(yī)師(副高)-推拿學(副高)考試參考題庫有答案
- 《旅游規(guī)劃與開發(fā)》馬勇教授
- 生產(chǎn)車間管理制度辦法
- 12j912-2常用設備用房
- 質(zhì)量獎與自評報告
- DTⅡ型固定式帶式輸送機設計選型手冊
- 橡膠壩工程施工質(zhì)量驗收評定表及填表說明編制于
- 抗日戰(zhàn)爭勝利題材話劇劇本范文
- GB/T 22328-2008動植物油脂1-單甘酯和游離甘油含量的測定
- 錄用offer模板參考范本
評論
0/150
提交評論