aspnet編譯成dll
1. 如何編譯生成dll
創建銀如DLL工程
這里,我們為了簡要說明DLL的原理,我們決定使用最簡單的編譯環境VC6.0,如下圖,我們先建立一個新的Win32 Dynamic-Link Library工程,名稱為「MyDLL」,在Visual Studio中,你也可以通過建立Win32控制台程序,然後在「應用程碧搏虧序類型」中選擇「DLL」選項,
點擊確定,選擇「一個空的DLL工程」,確定,完成即可。
一個簡單的dll
在第一步我們建立的工程中建立一個源碼文件」dllmain.cpp「,在「dllmain.cpp」中,鍵入如下代碼
[cpp] view plain
#include <Windows.h>
#include <stdio.h>
BOOL APIENTRY DllMain(HMODULE hMole, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("DLL_PROCESS_ATTACH\n");
break;
case DLL_THREAD_ATTACH:
printf("DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
printf("DLL_THREAD_DETACH\n");
break;
case DLL_PROCESS_DETACH:
printf("DLL_PROCESS_DETACH\n");
break;
}
return TRUE;
}
之後,我們直接編譯,即可以在Debug文件夾下,找到我們生成的dll文件,「MyDLL.dll」,注意,代碼裡面的printf語句,並不是必須的,只是我們用於測試程序時使用。而DllMain函數,是dll的進入/退出函數。
實際上,讓線程調用DLL的方式有兩種,分別是隱式鏈接和顯式鏈接,其目的均是將DLL的文件映像映射進線程的進程的地址空間。悔神我們這里只大概提一下,不做深入研究,如果感興趣,可以去看《Window高級編程指南》的第12章內容。
隱式鏈接調用
隱士地鏈接是將DLL的文件影響映射到進程的地址空間中最常用的方法。當鏈接一個應用程序時,必須制定要鏈接的一組LIB文件。每個LIB文件中包含了DLL文件允許應用程序(或另一個DLL)調用的函數的列表。當鏈接器看到應用程序調用了某個DLL的LIB文件中給出的函數時,它就在生成的EXE文件映像中加入了信息,指出了包含函數的DLL文件的名稱。當操作系統載入EXE文件時,系統查看EXE文件映像的內容來看要裝入哪些DLL,而後試圖將需要的DLL文件映像映射到進程的地址空間中。當尋找DLL時,系統在系列位置查找文件映像。
1.包含EXE映像文件的目錄
2.進程的當前目錄
3.Windows系統的目錄
4.Windows目錄
5.列在PATH環境變數中的目錄
這種方法,一般都是在程序鏈接時控制,反映在鏈接器的配置上,網上大多數講的各種庫的配置,比如OPENGL或者OPENCV等,都是用的這種方法
顯式鏈接調用
這里我們只提到兩種函數,一種是載入函數
[cpp] view plain
HINSTANCE LoadLibrary(LPCTSTR lpszLibFile);
HINSTANCE LoadLibraryEx(LPCSTR lpszLibFile,HANDLE hFile,DWORD dwFlags);
返回值HINSTANCE值指出了文件映像映射的虛擬內存地址。如果DLL不能被映進程的地址空間,函數就返回NULL。你可以使用類似於
[cpp] view plain
LoadLibrary("MyDLL")
或者
[cpp] view plain
LoadLibrary("MyDLL.dll")
的方式進行調用,不帶後綴和帶後綴在搜索策略上有區別,這里不再詳解。
顯式釋放DLL
在顯式載入DLL後,在任意時刻可以調用FreeLibrary函數來顯式地從進程的地址空間中解除該文件的映像。
[cpp] view plain
BOOL FreeLibrary(HINSTANCE hinstDll);
這里,在同一個進程中調用同一個DLL時,實際上還牽涉到一個計數的問題。這里也不在詳解。
線程可以調用GetMoleHandle函數:
[cpp] view plain
GetMoleHandle(LPCTSTR lpszMoleName);
來判斷一個DLL是否被映射進進程的地址空間。例如,下面的代碼判斷MyDLL.dll是否已被映射到進程的地址空間,如果沒有,則裝入它:
[cpp] view plain
HINSTANCE hinstDll;
hinstDll = GetMoleHandle("MyDLL");
if (hinstDll == NULL){
hinstDll = LoadLibrary("MyDLL");
}
實際上,還有一些函數,比如 GetMoleFileName用來獲取DLL的全路徑名稱,FreeLibraryAndExitThread來減少DLL的使用計數並退出線程。具體內容還是參見《Window高級編程指南》的第12章內容,此文中不適合講太多的內容以至於讀者不能一下子接受。
DLL的進入與退出函數
說到這里,實際上只是講了幾個常用的函數,這一個小節才是重點。
在上面,我們看到的MyDLL的例子中,有一個DllMain函數,這就是所謂的進入/退出函數。系統在不同的時候調用此函數。這些調用主要提供信息,常常被DLL用來執行進程級或線程級的初始化和清理工作。如果你的DLL不需要這些通知,就不必再你的DLL源代碼中實現此函數,例如,如果你創建的DLL只含有資源,就不必實現該函數。但如果有,則必須像我們上面的格式。
DllMain函數中的ul_reason_for_call參數指出了為什麼調用該函數。該參數有4個可能值: DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH、DLL_PROCESS_DETACH。
其中,DLL_PROCESS_ATTACH是在一個DLL首次被映射到進程的地址空間時,系統調用它的DllMain函數,傳遞的ul_reason_for_call參數為DLL_PROCESS_ATTACH。這只有在首次映射時發生。如果一個線程後來為已經映射進來的DLL調用LoadLibrary或LoadLibraryEx,操作系統只會增加DLL的計數,它不會再用DLL_PROCESS_ATTACH調用DLL的DllMain函數。
而DLL_PROCESS_DETACH是在DLL被從進程的地址空間解除映射時,系統調用它的DllMain函數,傳遞的ul_reason_for_call值為DLL_PROCESS_DETACH。我們需要注意的是,當用DLL_PROCESS_ATTACH調用DLL的DllMain函數時,如果返回FALSE,說明初始化不成功,系統仍會用DLL_PROCESS_DETACH調用DLL的DllMain。因此,必須確保沒有清理那些沒有成功初始化的東西。
DLL_THREAD_ATTACH:當進程中創建一個線程時,系統察看當前映射到進程的地址空間中的所有DLL文件映像,並用值DLL_THREAD_ATTACH調用所有的這些DLL的DllMain函數。該通知告訴所有的DLL去執行線程級的初始化。注意,當映射一個新的DLL時,進程中已有的幾個線程在運行,系統不會為已經運行的線程用值DLL_THREAD_ATTACH調用DLL的DllMain函數。
而DLL_THREAD_DETACH,如果線程調用ExitThread來終結(如果讓線程函數返回而不是調用ExitThread,系統會自動調用ExitThread),系統察看當前映射到進程空間的所有DLL文件映像,並用值DLL_THREAD_DETACH來調用所有的DLL的DllMain函數。該通知告訴所有的DLL去執行線程級的清理工作。
這里,我們需要注意的是,如果線程的終結是因為系統中的一個線程調用了TerminateThread,系統就不會再使用DLL_THREAD_DETACH來調用DLL和DllMain函數。這與TerminateProcess一樣,不再萬不得已時,不要使用。
下面,我們貼出《Window高級編程指南》中的兩個圖來說明上述四種參數的調用情況。
好的,介紹了以上的情況,下面,我們來繼續實踐,這次,建立一個新的空的win32控制台工程TestDLL,不再多說,代碼如下:
[cpp] view plain
#include <iostream>
#include <Windows.h>
using namespace std;
DWORD WINAPI someFunction(LPVOID lpParam)
{
cout << "enter someFunction!" << endl;
Sleep(1000);
cout << "This is someFunction!" << endl;
Sleep(1000);
cout << "exit someFunction!" << endl;
return 0;
}
int main()
{
HINSTANCE hinstance = LoadLibrary("MyDLL");
if(hinstance!=NULL)
{
cout << "Load successfully!" << endl;
}else {
cout << "Load failed" << endl;
}
HANDLE hThread;
DWORD dwThreadId;
cout << "createThread before " << endl;
hThread = CreateThread(NULL,0,someFunction,NULL,0,&dwThreadId);
cout << "createThread after " << endl;
cout << endl;
Sleep(3000);
cout << "waitForSingleObject before " << endl;
WaitForSingleObject(hThread,INFINITE);
cout << "WaitForSingleObject after " << endl;
cout << endl;
FreeLibrary(hinstance);
return 0;
}
代碼很好理解,但是前提是,你必須對線程有一定的概念。另外,注意,我們上面編譯的獲得的「MyDLL.dll"必須拷貝到能夠讓我們這個工程找到的地方,也就是上面我們提到的搜索路徑中的一個地方。
這里,我們先貼結果,當然,這只是在我機器上其中某次運行結果。
有了上面我們介紹的知識,這個就不是很難理解,主進程在調用LoadLibrary時,用DLL_PROCESS_ATTACH調用了DllMain函數,而線程創建時,用DLL_THREAD_ATTACH調用了DllMain函數,而由於主線程和子線程並行的原因,可能輸出的時候會有打斷。但是,這樣反而能讓我們更清楚的理解程序。
2. 在怎樣情況下把代碼編譯成dll文件
如果使用的是VS,可以進行如下操作:
打開VS, 文件-新建-新建項目-其他語言-Visual C++ - Win32 控制台應用程序。
單擊確定後,彈出對話框,按照對話框「下一步」提示進行操作。
將要編譯的C文件拷貝到CreateDLL項目中,.h文件就放到頭文件夾的目錄下,.c文件放到源文件目錄下,注意後綴名為.c的文件都要改成.cpp,否則編譯會出錯。
注意:申明函數時必須參照上圖紅框標示出來的規則,在Function.cpp文件中必須要引入對應的#include CreateDLL.h。
選中所有需要編譯成dll的cpp文件,右鍵-屬性-預編譯頭-不使用預編譯頭,然後選擇 「生成」即可,這樣在項目的Debug文件夾下面便可找到CreateDLL.dll文件
3. 在asp中,加prepared=true的話會把信息編譯,請問是編譯成dll嗎
肯定不是編譯為dll,可能是編譯為機器能懂的語言
4. 在asp.net中aspnet_filter.dll文件和aspnet_isapi.dll文件的作用各是什麼
aspnet_filter.dll 的作用是保護安者脊全,比如WebSite中的App_Code文件夾,還有用戶不能訪問代碼文件或配置文件等等。
aspnet_isapi.dll 當用戶請求一個aspx文件時,IIS會把這個請求交給.NET framework處理,fw會解析反射調用你寫好的cs代碼,然後在把返回的數據交給IIS,你可以在IIS的網站首游滲上右鍵屬性-主目錄磨汪-配置-映射 裡面找 擴展名.aspx 文件被映射到aspnet_isapi.dll上。
5. 如何編譯生成dll
使用VC下的cl和link手工創建dll並實現函數導入
1、創建dll頭文件:
/*
* dllmain.h
*/
#ifndef _DLLMAIN_H
#define _DLLMAIN_H
int getNumber();
#endif
2、創建dll源文件:
/*
* dllmain.c
*/
#include "dllmain.h"
int getNumber()
{
return 10;
}
3、 創建def文件:
; export.def
LIBRARY MY_DLLMAIN ; MY_DLLMAIN 將成為生成的dll的名稱
EXPORTS
getNumber @1 ; 這個名稱即為函數的實際導出名稱 @1為函數的導出編號
4、生成dll文件:
cl dllmain.c /c
link /def:export.def /dll dllmain.obj
這時,工程中已經包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,後4個文件是編譯鏈接過程中生成的文件
5、創建dlltest.c:
/*
* dlltest.c
*/
#include <stdio.h>
#include "dllmain.h" //dll庫的頭文件
#pragma comment(lib,"dllmain.lib") //dllmain.lib即是上一步生成的文件
int main()
{
printf("%dn",getNumber());
}
6、編譯、鏈接dlltest.c
cl dlltest.c /c
link dlltest.obj
注意:這里dllmain.lib和dllmain.h應該和dlltest.c在同一個目錄中。此步的結果將生成 dlltest.exe
7、運行:
dlltest
這時,系統將載入my_dllmain.dll這個動態鏈接庫,將調用其中的getNubmer函數。
6. c#如何將類庫輸出成dll
把你寫好的類庫編譯一下就可以搜隱生成dll了,生成的dll在bin/debug文件夾下,dll的名字和世桐廳你類庫的名字是一樣的。
前提是你新建項目的時候記得選擇「類輪銷庫」類型,不要選成winfrom,web什麼的了。
7. ASP.NET常見錯誤大全
檢測到有潛在危險的 Request Form 值
原因:
( )在提交數據的頁面或webconfig中沒有對validateRequest的屬性進行正確的設置
( )HTML裡面寫了轎爛旅兩個<form>引起
解決:
方案一 在 aspx文件頭中加入這句 <%@ Page validateRequest= false %>
方案二 修改nfig文件:
<configuration>
<system web>
<pages validateRequest= false />
</system web>
</configuration>
因為validateRequest默認值為true 只要設為false即可
在沒有任何數據時進行無效的讀取嘗試 解決辦法
原因
所返回的sqldatareader無數據記錄 但沒有作記錄判斷力處理 返回的是空值
加上判斷即可 if (reader read()) { TextName Text =
reader[ FieldName ] ToString(); }
數據為空 不能對空值調用此方法或屬性
原因:
若對象是null 那麼調用對象的方法例如ToString()肯定出錯一般是數歷宴據庫欄位的值為空
在grideview等閉凳數據控制項常出現
解決:因此建議作NULL處理
閱讀器關閉時 FieldCount 的嘗試無效
原因:
使用了SqlDataReader來綁定數據後 將connection對象作了Close()處理
類似
public SqlDataReader GetSomething()
{
conn open();
SqlDataReader reader =
sqlcmd ExcecutReader(CommandBehavior CloseConnection));
conn close();// occur error here
return reader;
}
在綁定的時候調用了這個方法來指定數據源 如果使用這個方法則需要在調用函數中關閉Re
ader這樣conn就可以自動關閉
如果是使用的是SqlDataAdapter和DataSet那麼請去掉顯式關閉conn的調用 或者在finally
中調用之
未能映射路徑
原因:可能是在webconfig中的路徑配置不正確所致 在FCKEditor的配置中這種問題比較突出
<add key= FCKeditor:BasePath value= ~/admin/fckeditor/ />
<add key= FCKeditor:UserFilesPath value= /UserFiles/ />
Unreachable code detected
原因
一般是在異常處理理或返回值時使用了 throw 或return 可能是其位置放在前面 造成後面的代碼執行到了
解決
把相關的異常拋出處理的語句(throw)或return 的語句放到代理執行的最後一行
索引超出范圍 必須為非負值並小於集合大小
原因
( ) 沒有設置DATAKEYFIELD設為資料庫中相對應的唯一欄位(一般是主鍵)
( ) DataGrid Columns > e Item Cells
解決
( ) 設置datakeyfield
( ) 加入判斷語句unt (datagrid可以是其它相類似的伺服器控制項)
數據源不支持伺服器端的數據分頁
解決方法:
不要使用DataReader 改成使用DataSet 或使用自定義分頁形式 不採用提供的分頁功能
OleDbDataAdapter da = new OleDbDataAdapter(sql connection);
DataSet ds = new DataSet();
da Fill(ds News );
GridView DataSource = ds ;
GridView DataBind();
對象名 ***** 無效
原因:當前使用的資料庫中沒有*****這張表
解決: 查看是否程序中是否寫錯了所調用的表的名稱或看一下SQL資料庫中是否存在你所調用的表
在建立與伺服器的連接時出錯 在連接到 SQL Server 時 在默認的設置下 SQL
Server 不允許進行遠程連接可能會導致此失敗 (provider: 命名管道提供程序
error: 無法打開到 SQL Server 的連接)
solution: 主機上需要用固定的IP地址或伺服器地址
SqlDateTime 溢出 必須介於 / / : : AM 和 / / : : PM
之間
出現這種問題``多半是因為你更新資料庫時``datetime欄位值為空``默認插入 年 月
日``造成datetime類型溢出
出現 表示 屬性 此處應為 方法
原因:
VB與c#的方法 屬性的格式有所不一樣導致
可能是在design中綁定數據的語法出現錯誤 解決: 記住屬性用[] 方法用()
記住綁定數據的正確語法(有以下幾種方式::<%Container DataItem( 欄位名 )%> <%
#Eval( 欄位名 )%> <%Bind( 欄位名 )%>等)
未能從程序集 DAL Version= Culture=neutral
PublicKeyToken=null 中載入類型 DAL SqlHelper
原因:修改了其他層後未能重新編譯成dll
解決:編譯一下(Rebuild)
為過程或函數 指定的參數太多
solution:調用存儲過程與定義的存儲過程所用的參數數量或所執行的SQL語句中所傳入的參
數個數不一致(這是個SQL的錯誤)
解決方案:仔細檢查在存儲過程中所設定的參數變數 與實際輸入的參數值是否一一對應
無法啟動調試 綁定句柄無效
原因:系統的Terminal Services沒有開啟
Unable to debugging on the web server Debug failed because integrated windows authentication is not enable
解決方法:
打開vs >工具(Tools) >選項(Option) >調試(debugging) >編輯並繼續(Edit and Continue) >全部打勾
Automation 操作中文件名或類名未找到: RegExp
解決方法:regsvr vbscript dll
System NullReferenceException: 未將對象引用設置到對象的實例
原因:
( )所設置的變數為空值或沒有取到值 一般出現在傳遞參數的時候出現這個問題 也會在使用datagrid或gridview或datalist等數據控制項時出現
( )控制項名稱與codebehind裡面的沒有對應
( )未用new初始化對象
( )在程序中所引用的控制項不存在
解決方法:
( )使用try catch finally捕捉錯誤 或直接用response write()輸出所取的變數值
( )查看代碼中是否存在未初始化的變數
錯誤 文件被數字簽名策略拒絕(安裝vs sp 時)解決方法:
( ) 單擊 開始 單擊 運行 鍵入 control admintools 然後單擊 確定
( ) 雙擊 本地安全策略
( ) 單擊 軟體限制策略 (注意 如果未列出軟體限制 請右擊 軟體限制策略 然後單擊 新建策略 )
( ) 在 對象類型 下 雙擊 強制
( ) 單擊 除本地管理員以外的所有用戶 然後單擊 確定
( ) 重新啟動計算機
微軟說明
vs 不能從源文件模式切換到視圖模式
解決方法:dos下運行下 devenv /resetskippkgs (win+r cmd)
Validation of viewstate MAC failed
解決辦法:頁面的頂部page加 EnableViewState= False EnableViewStateMac = False 來解決這個問題
Automation server can t create object (Automation 伺服器不能創建)
解決辦法:運行: Regsvr scrrun dll 即可
包載入失敗
未能正確載入包 Visual Web Developer Trident Designer Package (GUID =
{ AE E C D E F A AEFF }
解決方法:
設置系統變數 VsLogActivity=
在%APPDATA%MicrosoftVisualStudio 文件夾下創建文件ActivityLog xml
Error
Microsoft Visual Studio
LoadLibrary failed for package [Visual Web Developer Trident Designer Package]
{ AE E B C D E F A AEFF }
e
c:Program FilesMicrosoft Visual Studio Common Packages ridsn dll
從 WINNTMicroSoft NETFrameworkv xxx 復制文件gdiplus dll 到 Program FilesVisual Studio Common Packages文件夾下
在命令行下運行命令 devenv /resetskippkgs
Error spawning cmd exe
解決方案:把cmd exe 拷貝到VS安裝目錄下的VC/BIN目錄里 可以解決問題
嘗試讀取或寫入受保護的內存
解決:硬體有問題 一般內存有問題
無法在證書存儲區中找到清單簽名證書
解決方法:用記事本打開項目的 csproj文件 刪除類似
該項目中不存在目標 ResolveKeySource
原因:這個問題很罕見 查詢國外相關資料後 大致說是由於部署的不是一個標準的solution 需要在VS自帶的命令提示中運行下面這個東西恢復
解決方法:
( ) 將下列代碼存為XML文件 命名為TestBuild xml
<Project DefaultTargets= Build xmlns= >
<PropertyGroup>
<TargetConnectionString>Data Source= sql % BUser ID=SqlUser% BPooling=False% BPassword=X</TargetConnectionString>
</PropertyGroup>
<ItemGroup>
<DatabaseProject Include= Database Database dbproj />
<DatabaseProject Include= Database Database dbproj />
</ItemGroup>
<Target Name= BuildAllDatabaseProjects >
<MSBuild
Properties= TargetConnectionString=$(TargetConnectionString)
Projects= @(DatabaseProject)
Targets= Build;Deploy >
</MSBuild>
</Target>
( )在命令提示中運行:m *** uild /t:BuildAllDatabaseProjects TestBuild xml
</Project>
不能將值 NULL 插入列 **
原因:這是資料庫表設計的錯誤 所涉及的表的欄位中設置了不能為空的屬性 但是傳入的值為null 所以報錯
解決方法:查看是否所傳入的值是否為Null 或修改資料庫中表的所對應的列的屬性
未能載入類型 命名空間 類
原因:
( )項目修改後沒有進行編譯
( )項目中原有的命名空間可能被修改了
( )項目中所需要的ascx或其他頁面不存在 或不包含在項目中
解決方法:
( )在修改完成之後 請重新生成或編譯整個項目或解決方案
( )手工修改所改動的命名空間 注意名稱的大小寫 再重新編譯
( )將相關的文件包含在項目中
不能訪問只讀文件 **** ***
解決方案:
給虛擬目錄所對應的文件加上 Everyone/寫入 許可權即可
請求因 HTTP 狀態 失敗 Access Denied解決方法:在iis信息伺服器上把匿名訪問和允許iis控制密碼給勾上
有一個無效 SelectedValue 因為它不在項目列表中
原因
( )在沒有綁DropDownList之前就給DropDownList SelectedValue 賦值
( )dropdownlist中出現了null值
無法在 已存在的情況下創建/影像復制該文件
解決方案 重新編譯項目(多個project全部重新編譯) 關閉vs 重新打開 必要時重新啟動機子
用戶 CASPNET 登錄失敗登錄失敗
異常詳細信息: System Data SqlClient SqlException: 用戶 COOASPNET 登錄失敗
這是怎麼回事啊?
因為你的程序連接SQLServer的連接字元串是用了windows集成登陸 你可以改成用資料庫帳號密碼登陸 連接字元串的寫法是
server=localhost;uid=sa;pwd=xxxx;database=master;
server是資料庫伺服器的機器名或者IP 如果是同一台機可以用localhost
uid是資料庫登陸帳號
pwd是資料庫密碼
database是資料庫初始owner名稱
答案
右擊桌面我的電腦 選擇 管理 雙擊打開的 計算機管理 對話框中的 本地用戶和組 下的 組 在右邊的窗口中雙擊 Remote Desktop Users 組 在打開的 Remote Desktop Users 屬性對話框中 單擊添加 在打開的 添加用戶 對話框中單擊 高級 再單擊 立即查找 按鈕 在 搜索 結果中 雙擊ASPNET(如果是IIS NEOR SERVERCE )再點擊兩次確定完成添加 用戶
單擊 開始 所有程序 Microsoft SQL Server 企業管理器 在打開的 控制台根目錄 選擇相應的資料庫 右擊該資料庫的中的 用戶 選擇 新建資料庫用戶 在 新建用戶 對話 框中點擊 登陸名 右側的下拉列表框 選擇 新建 打開 新建登陸對話框 點擊名稱右側的 省略號按鈕 在打開的對話框中將 列出的名稱 中選擇 本機的名稱 再在下面的名稱框中選定 Remote Desktop Users 然後點擊 成員 按鈕 雙擊 ASPNET(如果是IIS NEOR SERVERCE ) 然後點擊確定 在 新建登陸對話 框 中的默認設置的 資料庫 選項中選擇相應的資料庫名稱 再在 資料庫訪問 選項下勾選相應 的資料庫點擊確定 完成將默認的匿名用戶添加到SQL
用戶 nt authority eork service 登錄失敗
> sqlserver 調成sql server 和windows驗證模式
>
(以下方法僅供參考)
第一步 把 NT AUTHORITYNEORK SERVICE 添加到Administrator組中
我的電腦 >右鍵 >管理 >本地用戶和組
選擇 組 >雙擊Administrators >單擊 添加 >單擊 高級 >單擊 立即查找 >在下面的列表中選擇Neork Service用戶 >兩次單擊 確定 >加入
第二步 在企業管理器中加入NetWord Service用戶
打開Sql Server企業管理器 >選擇資料庫實例 >打開 安全性 節點 >選擇 登錄 >在右邊的列表中單擊右鍵 >選擇 新建登錄 >在 常規 選項卡中單擊 名稱 旁邊的按鈕 >選擇 Administrators 組 >單擊下面的 成員 按鈕 >選擇 Neork Service >單擊 添加 按鈕 >單擊 確定 返回 新建登錄 對話框 >保證身份驗證類型為 windows驗證 和 允許訪問 >單擊 確定 >關閉 企業管理器
第三步
重新運行程序 資料庫連接字元串選擇windows驗證即可
> 在sqlserver中添加帳戶或IIS_WPG工作組
此方法來自於
未能載入視圖狀態 正在向其中載入視圖狀態的控制項樹必須與前一請求期間用於保存視圖狀態的控制項樹相匹配 例如 當以動態方式添加控制項時 在回發期間添加的控制項必須與在初始請求期間添加的控制項的類型和位置相匹配
原因 viewstate的在作用是將控制項的狀態保存 在下次Post給伺服器 伺服器進行恢復控制項的狀態 (控制項的狀態包括 值和事件 )
解決方法
( )每一個UserControl的viewstate都改為false
( )加入這個
this Page EnableViewState = false;
此方法來源於 _astar/archive/ / / /l
由於啟動用戶實例的進程時出錯 導致無法生成 SQL Server 的用戶實例 該連接將關閉
問題原因
這是微軟的bug 並且微軟已經承認 詳情如下
出現此錯誤的條件是 你用過遠程桌面連接 並且安裝了SQL +VS 就有很大可能觸發這個問題 微軟說會在將來的XP SP 裡面解決掉這個問題
解決
ID= &SiteID=
如果你看不懂英文 那麼我告訴你我的解決辦法
刪除C:Documents and Settings[USERNAME]Local SettingsApplication DataMicrosoftMicrosoft SQL Server DataSQLEXPRESS目錄即可 [USERNAME]是Windows用戶名 比如說Administrator
此問題來於
Server Application Unavailable
The web application you are attempting to access on this web server is currently unavailable Please hit the Refresh button in your web browser to retry your request
Administrator Note: An error message detailing the cause of this specific request failure can be found in the application event log of the web server Please review this log entry to discover what caused this error to occur
解決
如果你運行WinXP/IIS 為了給ASPNET工作進程訪問你的web工程文件夾的權力請到網站文件所在的目錄 右鍵一級文件夾 選Security-Add-鍵入 ASPNET 點擊OK或點擊Check Names 如果彈出對話框提示 Name not Found 則應點擊Locations改變位置到本機計算機名 點擊OK 分配此用戶許可權為 Full Control 點擊OK
錯誤變為
You are not authorized to view this page
You do not have permission to view this directory or page using the credentials you supplied
解決
在IIS里右鍵此虛擬目錄-Properties-Directory Security-Edit 勾選上Integrated Windows authentication即可
超時時間已到 超時時間已到 但是尚未從池中獲取連接 出現這種情況可能是因為所有池連接均在使用 並且達到了最大池大小
可能原因如下 並發操作 Connection用後沒有關閉 或者因為DataReader連接獨占連接
解決方法
修改幾個關鍵頁面或訪問比較頻繁的資料庫訪問操作 使用DataAdapter和DataSet來獲取資料庫數據 不要使用DataReader
在訪問資料庫的頁面上使用數據緩存 如果頁面的數據不是經常更新(幾分鍾更新一次)的話 使用Cache對象可以不用訪問資料庫而使用緩存中的內容 那麼可以大大減少連接數量
修改代碼 把使用Connection對象的地方都在Close()後面加上Dispose()調用
建議對資料庫操作進行大的修改 建立自己的資料庫操作代理類 繼承System IDisposable介面 強迫釋放資源 這樣就不會出現連接數量不夠的問題了
包載入失敗
未能正確載入包 Visual Web Developer Trident Designer Package (GUID =
{ AE E C D E F A AEFF } 請與包供應商聯系以獲得幫助 由於可能會發生環境損壞 建議重新啟動應用程序 要禁止將來將來載入此包嗎?可以使用 devenv reswetskippkgs 重新啟用包載入
每次開機打開vs 都會有這個提示 煩
於是在google了一下 發現很多方法都試過了 只有一個解決一試就行
解決方法如下:
設置系統變數 VsLogActivity=
在%APPDATA%MicrosoftVisualStudio 文件夾下創建文件ActivityLog xml
從 WINNTMicroSoft NETFrameworkv xxx 復制文件gdiplus dll 到 Program FilesVisual Studio Common Packages文件夾下
在命令行下運行命令 devenv /resetskippkgs
注:發現此問題只有在win 會出現 win 就不會出現這個問題
用戶 xxxASPNET登錄失敗
第一步
把 NT AUTHORITY NetWORK SERVICE 添加到Administrator組中
我的電腦 >右鍵 >管理 >本地用戶和組
選擇 組 >雙擊Administrators >單擊 添加 >單擊 高級 >單擊 立即查找 >在下面的列表中選 Neork Service用戶 >兩次單擊 確定 >加入
第二步 在企業管理器中加 Neork Service用戶
打開Sql Server企業管理器 >選擇資料庫實例 >打開 安全性 節點 >選擇 登錄 >在右邊的列表中單擊右鍵 >選擇 新建登錄 >在 常規 選項卡中單擊 名稱 旁邊的按鈕 >選擇 Administrators 組 >單擊下面的 成員 按鈕 >選擇 Neork Service >單擊 添加 按鈕 >單擊 確定 返回 新建登錄 對話框 >保證身份驗證類型為 windows驗證 和 允許訪問 >單擊 確定 >關閉 企業管理器
第三步
重新運行asp Net程序 資料庫連接字元串選擇windows驗證即可
以上針對win 如果是win 加ASp Net用戶
無法在 已存在的情況下創建/影像復制該文件
解決方法 重新編譯整個項目 或者重啟電腦
Could not create an environment: OCIEnvCreate returned
解決方案一
主要是將oracle主目錄oracle的讀寫許可權賦予或者是IUSER_ 和IWAM_ 重啟計算機
解決二:
打開在IIS中的WEB屬性--主目錄--執行許可權【改為-腳本和可執行文件】
-應用程序池【改為-MSSharePointAppPool】 刷新OK
解決三:
文件夾許可權可以不用管
設置ORACLE_HOME變數的方法如下
控制面板>>系統>>高級>>環境變數>>系統變數>>新建系統變數
變數名寫ORACLE_HOME
變數值添實際的ORACLE_HOME路徑 在注冊表中有
由於目標機器積極拒絕 無法連接
在添加完引用後 用localhost替換掉所有的localhost: 重新編譯
能載入視圖狀態 正在向其中載入視圖狀態的控制項樹必須與前一請求期間用於保存視圖狀態的控制項樹相匹配 例如 當以動態方式添加控制項時 在回發期間添加的控制項必須與在初始請求期間添加的控制項的類型和位置相匹配
解決 在頁面的 Page 項添加 EnableViewState= false 即可
在以下方法或屬性之間的調用不明確 method 和 method
因隱式轉換的緣故 編譯器無法調用重載方法的某種形式 可以用以下方法糾正該錯誤
以不發生隱式轉換的方式指定此方法的參數
移除此方法的所有重載
在調用方法之前 強制轉換到正確的類型
在應用程序級別以外使用注冊為 allowDefinition= MachineToApplication
解決 在網站對應的虛擬目錄上右鍵 選屬性 然後在應用程序名後點創建 名字隨便填
[子目錄不會繼承上級的屬性 所以要將aspx文件所在的目錄屬性設置正確]
無法識別的配置節 connectionStrings
原因
用vs 開發的應用程序需要使 framework 而在iis中的默環境是 這時將發生不可識別的節點的問題
解決辦法
環境升級為 開始-》運行-》cmd-》
C:WINDOWSMicrosoft NETFrameworkv aspnet_regiis exe i
Timeout expired The timeout period elapsed prior to obtaining a connection from the pool This may have occurred because all pooled connections were in use and max pool size was reached
Description: An unhandled exception occurred ring the execution of the current web request Please review the stack trace for more information about the error and where it originated in the code
Exception Details: System InvalidOperationException: Timeout expired The timeout period elapsed prior to obtaining a connection from the pool This may have occurred because all pooled connections were in use and max pool size was reached
主要原因可能有
使用了連接池 大量的sqlconnection用了後忘記關閘門 導致SQL佔用嚴重 可以用 exec sp_who 這個存儲過程查看一下
連接池的連接數有所限制
解決方法:
釋放連接池 調用Connection對象的Close()方法關閉資料庫連接
利用try catch finally對資料庫連接進行異常處理 當無法連接資料庫時將拋出異常 並顯示出錯信息 見catch代碼塊所示 在此程序中 無論是否發生異常 都可以通過finally區塊關閉資料庫的連接 從而節省計算機資源
將SqlConnection對象包含到using區塊中 這樣程序會自動調用Dispose()方法釋放SqlConnection對象所佔用的系統資源 無需再使用SqlConnection對象的Close()方法
指定min pool size表示連接池允許的最小連接數(默認為 ) 下面的代碼指定了SqlConnection對象的max pool size為 min pool size為
lishixin/Article/program/net/201311/11175
8. c#.net怎麼將自定義控制項的.cs文件編譯成.dll控制項
(一).用戶控制項和自定義控制項概述
用戶控制項(UserControl): 擴展名為*.ascx,跟*.aspx在結構上相似,是指頁面中
載入的功能塊,只是用戶控制項不能單獨作為頁面運行,必須嵌入到*.aspx頁面或其它用
戶控制項中使用.
自定義控制項,跟HtmlControl或WebControl相似,編譯後可以添加引用到工具欄里
面,直接用滑鼠拖動使用.(二).使用在一個大系統中,有時候會只能幾個*.aspx頁面,其餘的都是做成*.ascx頁面,
這樣可以增強頁面之間的藕合性,一個用戶控制項*.ascx都作為一個獨立的功能塊.
自定義控制項是指編譯後直接可以放到工具箱中用,就像TextBox,DataGrid一樣
在設計器中可以用滑鼠拖動到頁面上使用.
自定義伺服器控制項分為兩種:
1.一種是用*.aspx代碼和*.cs代碼編譯後生成DLL,再添加引用到工具箱使用.
一般用於WebForm中.
2.另一種是只用*.cs實現,再編譯生成DLL,添加到工具箱使用.
一般用於WinForm中.
自定義控制項生成步驟:比如:
1. 將一個Button從設計器拖到頁面中,
對按鈕大小,顏色或文本設置一個固定值,保存文件名為: a.cs
2. csc /r:System.dll /t:library/out:..\..\A.dll a.cs
3. 右擊工具箱空白處,彈出右擊菜單後,選「添加移除項」,將剛生成的DLL
9. ASP.NET如何將ASCX文件編譯成DLL文件然後再工具箱中可以添加進去的
在工具欄 空白的地方右鍵,選擇「添加選項卡」,然後給選項卡起個名字。例如叫做ExtAspNet,然後右鍵剛添加的那個選項卡,選擇右鍵菜單中的「選擇項」,在彈出窗口中,點擊下邊的「瀏覽」按鈕去找到你要添加的控制項的dll,然後確定。理論上講,最簡單的配置就已經完成了。不過大多數下載的第三方控制項還需要對web.config文件進行配置。這個視情況而定
10. ASP封裝成DLL以後怎麼能反編譯回來
目前,還沒有確實可行的方法
最多隻能反編譯為
匯編語言