1. 程式人生 > >C#編寫和呼叫動態連結庫

C#編寫和呼叫動態連結庫

3705.288
--
dll檔案是你伺服器端指令碼編譯後生成的元件,也就是說一但編譯成dll後,
軟體發行後,你對應頁面的伺服器端指令碼檔案.aspx.cs就不需要釋出了,
因為程式碼已經封裝在工程名.dll檔案裡了.而.pdb檔案據我理解,可能是帶上了一些資源類的檔案吧,
所以檔案要比相應的dll檔案大,至於你說的這個問題,我沒碰到過,幫不了你
--
我是在類庫專案中生成的DLL,然後在asp.net專案中呼叫。
btw:我剛才測試了一個新的C#生成的DLL,沒有引入其它dll,
一樣的操作不會報錯,樓上的那個dll引用了其它dll,請問和這個有關嗎?
----
我只能說有可能
---
那這樣說你自己也發現了答案呢,把間接引用到的DLL也加入到工程中試試看
----
比如有一個別人寫的aa.dll,在我的類庫中引用了,還需要在asp.net工程中引用嗎?
----
一般StackOverflowException是由於無限迴圈等原因引起的,看看你的程式碼會不會有這個問題。
----
比如有一個別人寫的aa.dll,在我的類庫中引用了,還需要在asp.net工程中引用嗎?
我猜想還應該用的吧,你自己做個小的程式來試試看。
我覺得你的類庫雖然引用了那個DLL,但並沒有把那個DLL也編譯進你自己的DLL中(有沒有靜態編譯?)
----
靜態編譯?不是很明白我是通過vs.net生成的
----
debug會生成兩個檔案
pdf負責除錯工作
釋出的時候應該使用realease版本
-------------------------------------------------------------------------------------------------------------------------------

c#生成DLL檔案,內部函式的問題

用C#編寫一組處理XML文件的程式碼,由於要求生成DLL檔案,並由外部的其他工具訪問動態庫中的檔案,
但是用Dependency Walker檢測我生成的這個DLL檔案沒有顯示任何的函式,以前沒做過這方面的東西,求教了

程式碼如下:
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
DeleteArg();
}
static void DeleteArg()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"c:\\data1.xml");
XmlNode root = doc.DocumentElement;
XmlNode Node1;
XmlNodeList nodeList = doc.SelectSingleNode("/Entity/Columns").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("Name") == "SysModuleID")
{
xe.RemoveAll();
//xe.RemoveAttribute("Name");//刪除Name屬性
}
}
doc.Save("c:\\data1.xml");//儲存這個文件到檔案中
}
}

以上程式碼實現刪除XML檔案中某一節點的功能,如何在生成DLL後能夠使用檢測工具檢測出DeleteArg函式,
使用Dependency Walker沒檢測出該函式是不是以為著這個動態庫檔案不能被呼叫.
----
因為.net的程式不是這樣把函式放在匯出表的, 我記得.net做的dll只匯出了一個_CorDllMain的方法,
所以用Dependency Walker是看不出來的. 如果你想看.net做的dll匯出了什麼內容,可以用反射檢視元資料
----
生成這個DLL庫檔案,是想要別的工具執行這個動態庫檔案,實現DELETEARG()這個函式的功能
----
可以的
----
你上面的程式碼不是生成DLL的,而是一個控制檯應用程式.

要想建立動態庫(DLL),在新建專案視窗中選擇"類庫", 預設的程式碼是這樣的:

using System;
using System.Collections.Generic;
using System.Text;

namespace ClassLibrary2
{
public class Class1
{
}
}


// 然後新增你的程式碼.最後程式碼如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace ClassLibrary2
{
public class Class1
{
public void DeleteArg()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"c:\\data1.xml");
XmlNode root = doc.DocumentElement;
XmlNode Node1;
XmlNodeList nodeList = doc.SelectSingleNode("/Entity/Columns").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("Name") == "SysModuleID")
{
xe.RemoveAll();
//xe.RemoveAttribute("Name");//刪除Name屬性
}
}
doc.Save("c:\\data1.xml");//儲存這個文件到檔案中
}
}
}

最後編譯一下就可以,
在Debug資料夾下回產生一個dll檔案,最後在需要的工程裡,將這個dll檔案引進進去就可以用.
例如:
using ClassLibrary2;

......
Class1 class = new Class1();
class.DeleteArg();

好了!結束!