----------------------------------------------------
2010-05-30 更新:
最初遇到这个问题的时候,想到了由于unix系统的原因文件名大小写敏感导致了这个问题,这段时间看mono的源代码,找到的源码所在,更直观一些。
mono的底层库用的最开始用的是eglibc,访问文件正式用的这个库。当然,unix标准的库,大小写肯定不能放过。
加载程序集:
static MonoAssembly * real_load (gchar **search_path, const gchar *culture, const gchar *name, gboolean refonly) { MonoAssembly *result = NULL; gchar **path; gchar *filename; const gchar *local_culture; gint len; gboolean is_private = FALSE; if (!culture || *culture == '\0') { local_culture = ""; } else { local_culture = culture; } filename = g_strconcat (name, ".dll", NULL); len = strlen (filename); for (path = search_path; *path; path++) { if (**path == '\0') { is_private = TRUE; continue; /* Ignore empty ApplicationBase */ } /* See test cases in bug #58992 and bug #57710 */ /* 1st try: [culture]/[name].dll (culture may be empty) */ strcpy (filename + len - 4, ".dll"); if (try_load_from (&result, *path, local_culture, "", filename, refonly, is_private)) break; /* 2nd try: [culture]/[name].exe (culture may be empty) */ strcpy (filename + len - 4, ".exe"); if (try_load_from (&result, *path, local_culture, "", filename, refonly, is_private)) break; /* 3rd try: [culture]/[name]/[name].dll (culture may be empty) */ strcpy (filename + len - 4, ".dll"); if (try_load_from (&result, *path, local_culture, name, filename, refonly, is_private)) break; /* 4th try: [culture]/[name]/[name].exe (culture may be empty) */ strcpy (filename + len - 4, ".exe"); if (try_load_from (&result, *path, local_culture, name, filename, refonly, is_private)) break; } g_free (filename); return result; }
文件判断:
gboolean g_file_test (const gchar *filename, GFileTest test) { struct stat st; gboolean have_stat; if (filename == NULL || test == 0) return FALSE; have_stat = FALSE; if ((test & G_FILE_TEST_EXISTS) != 0) { if (access (filename, F_OK) == 0) return TRUE; } if ((test & G_FILE_TEST_IS_EXECUTABLE) != 0) { if (access (filename, X_OK) == 0) return TRUE; } if ((test & G_FILE_TEST_IS_SYMLINK) != 0) { have_stat = (lstat (filename, &st) == 0); if (have_stat && S_ISLNK (st.st_mode)) return TRUE; } if ((test & G_FILE_TEST_IS_REGULAR) != 0) { if (!have_stat) have_stat = (stat (filename, &st) == 0); if (have_stat && S_ISREG (st.st_mode)) return TRUE; } if ((test & G_FILE_TEST_IS_DIR) != 0) { if (!have_stat) have_stat = (stat (filename, &st) == 0); if (have_stat && S_ISDIR (st.st_mode)) return TRUE; } return FALSE; }
------------------------------------------------------------
今天尝试着在linux下面用mono访问MySql。
官方提供了ADO.NET Driver for MYSQL (http://www.mysql.com/downloads/connector/net/).其中东西很简单,几个dll文件,以及一个MSDN样式的CHM文档文件。
运行程序的时候总是有问题,提示信息:
The following assembly Referenced from Test.exe could not be loaded:
Assembly: MySql.Data (assemblyref_index=1)
Version: 6.2.3.0
Public Key: c5687fc88969c44d
The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly
但是我明明已经添加好了引用,而且目录中有官方提供的mysql.data.dll.试了几次都不行,于是猜测是不是文件明的问题,因为*nix下文件名大小写敏感。改成MySql.Data.dll了之后,居然就好了。
不知道这个问题算什么问题,哪天看看mono的代码,怎么觉得应该是他的问题。