介紹
公共語言基礎設施
(cli)
的目的是使它「容易
」與現有**進行互操作。原則上
,所有您需要做的就是建立乙個函式宣告
dllimport
為現有的**來呼叫
,執行時將處理其餘的。例如:
[dllimport
("libc.so")]
private
static
extern
intgetpid
();
請注意,
大多數的類和列舉提到在這個文件儲存在
system.runtime.interopservices
namespace.
上面的c#
函式宣告將呼叫
posix getpid(2)
系統呼叫的平台上有
libc.so庫
如果libc.so
存在但getpid
沒有輸出
, 丟擲乙個
entrypointnotfoundexception
異常。如果
libc.so
不能載入
, 丟擲乙個
dllnotfoundexception
異常。簡單
,直接。有什麼能比這更容易?
有三個問題
1
在dllimport
語句指定庫。
2
確定實際呼叫哪個函式。
3
傳遞引數
,大多數現有的**更複雜。字串需要被傳遞
,結構可能需要被傳遞
,記憶體管理實踐也將參與……
現有的**是乙個複雜的怪獸
,和互操作層需要支援這種複雜性。
庫處理
如何在執行時發現,並指定在
dllimport
屬性中?
這個問題本質上是特定於平台的。
windows dll
搜尋路徑
從msdnloadlibrary
文件,dll
程式所需的是按照下面的順序進行搜尋:
1. 應用程式載入的目錄。
2. 當前目錄
3. 系統目錄,使用
getsystemdirectory()
函式來獲得這個目錄的路徑。
4. 16位系統目錄。
5. windows
目錄。使用
getwindowsdirectory()
函式來獲得這個目錄的路徑。
6. path
環境變數中列出的目錄。
當然,現實並沒有那麼簡單。實際上
,「system」
目錄實際上是
%windir%\system32,
除了windows9x
平台%windir%\system。16
位系統目錄通常
%windir%\system,
但不被視為乙個單獨的搜尋目錄在
windows 9 x
平台。 此外
,在windows server 2003
和windows xp sp1,
登錄檔入口
hkey_local_machine\system\currentcontrolset\control\sessionmanager\safedllsearchmode
改變上述命令
, 如果這是
1(預設
),然後搜尋當前目錄是在系統和
windows
目錄。這是乙個安全特性
(它可以防止木馬庫被載入代替,例如
,ole32.dll)
但它把上面的列表改為:1、
3、4、
5、2、
6。
linux
共享庫搜尋路徑
從dlopen(3)
手冊頁,
必要的程式所需的共享庫是按照下面的順序進行搜尋:
1在使用者的
ld_library_path
環境變數中
以冒號分隔的目錄列表
.這是乙個經常使用的方法
,允許本地共享庫是乙個
cli程式發現的。 2
庫的列表
,快取在
/etc/ld.so.cache
. /etc/ld.so.cache
是由編輯
/etc/ld.so.conf
和執行ldconfig.
編輯/ etc/ld.so.conf
首選方法是搜尋附加目錄
,而不是使用
ld_library_path,
因為這是更安全的
(很難達到乙個木馬庫到
/ etc/ld.s.cache
比插入到
ld_library_path)。
3 / lib,
緊隨其後的是
/ usr / lib。
作為乙個
mono
的擴充套件,
如果乙個庫正被載入是
__internal
,然後主程式是尋找方法符號。這相當於呼叫
dlopen(3)
和乙個檔名的空。
這允許您
p / invoke方法,
都在乙個應用程式嵌入
mono。
mac os x
框架和.dylib
搜尋路徑
框架和庫搜尋路徑是:
1在使用者的
dyld_framework_path
環境變數中以冒號分隔的目錄列表.
2在使用者的
dyld_library_path
環境變數中以冒號分隔的目錄列表.
3在使用者的
dyld_fallback_framework_path
環境變數中以冒號分隔的目錄列表
.它是預設目錄:
·
~/library/frameworks
·
/library/frameworks
·
/network/library/frameworks
·
/system/library/frameworks 4
在使用者的
dyld_fallback_library_path
環境變數中以冒號分隔的目錄列表
, 它是預設目錄:
·
~/lib
·
/usr/local/lib
·
/lib
·
/usr/lib 注意
:使用glib,mono
載入庫,
還有在mac os x
上glib
有bug
不使用,..dylib擴充套件,
而是使用
unix
.soextension,雖然這應該最終被修復
, 目前的解決方法是寫乙個
.config
檔案對映到
.dylib
檔案
dll
="mylib"
target
="mylib.dylib"/>
todo:
將mono
同時支援框架和
dylibs嗎?
不同的平台有不同的命名約定。
windows
平台上是庫名
.dll,
如ole32.dll
等。linux
平台使用
lib字首和乙個
.so字尾。
macosx
平台使用
lib字首和乙個
.dylib
字尾。除非他們是乙個框架
,在這種情況下
,他們是乙個目錄
,事情變得更加複雜。
本地庫與遠端庫互動
1.建立本地庫 參照git基礎 2.在github建立乙個遠端庫,獲取其位址 3.為位址取乙個別名 git remote add 別名 位址 4.推送到遠端庫 git push 別名 分支名 5.從遠端庫轉殖到本地庫 建立 origin 遠端位址別名 git clone 位址 有分支的情況下,不能直...
Git本地庫如何與遠端庫進行互動
對於此場景的描述 團隊內協同辦開發乙個專案,專案經理將其大致的框架 在本地 即自己的pc 通過git軟體放在了自己在 託管中心的,自己的遠端倉庫 repository 裡面,並且在託管中心邀請參與開發此專案的n名程式設計師作為乙個團隊協同開發。每名程式設計師都要去專案經理的遠端庫中去把其框架 clo...
Unity 人物建模與互動
int amnspeedid animator.stringtohash speed 動畫名稱轉換為id animator anim getcomponent 獲取當前的動畫器 float speed input.getaxis vertical anim.setfloat amnspeedid,s...