C# 코드로 관리되지 않는 dll, OCX 동적 등록
4470 단어 C#
///
/// DLL
///
public class DynamicLoadDll
{
///
/// , ,
///
///
///
///
///
private static Delegate GetFunctionAddress(int dllModule, string functionName, Type t)
{
int address = Kernel32Helper.GetProcAddress(dllModule, functionName); //
if (address == 0)
return null;
else
return Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);// 。
}
///
/// dll ,dll , dll
///
/// dll
/// dll
/// dll C#
///
///
///
public static object DynamicInvoke(string dllPath, string functionName,Type delegateType,out string msg,params object[] par)
{
msg = "";
int address = 0;
try
{
address = Kernel32Helper.LoadLibrary(dllPath);
if (address == 0)
{
msg = " dll ,dll :" + dllPath;
return null;
}
Delegate d1 = GetFunctionAddress(address, functionName, delegateType);
if (d1 == null)
{
msg = " , :" + functionName;
return null;
}
object result= d1.DynamicInvoke(par);
Kernel32Helper.FreeLibrary(address);
return result;
}
catch (Exception e)
{
if (address != 0)
{
Kernel32Helper.FreeLibrary(address);
}
msg = e.Message;
return null;
}
}
}
public class Kernel32Helper
{
///
/// API LoadLibrary
///
[DllImport("kernel32")]
public static extern int LoadLibrary(string funcName);
///
/// API GetProcAddress
///
[DllImport("kernel32")]
public static extern int GetProcAddress(int handle, string funcName);
///
/// API FreeLibrary
///
[DllImport("kernel32")]
public static extern int FreeLibrary(int handle);
}
사용:
class Program
{
public delegate int DllRegisterHandler();
public delegate int DllUnregisterHandler();
static void Main(string[] args)
{
string msg = "";
string dllFunction = "DllRegisterServer";
string[] dllPathList = System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory,"*.ocx", System.IO.SearchOption.TopDirectoryOnly);
if (dllPathList != null && dllPathList.Length > 0)
{
foreach (var dllPath in dllPathList)
{
object o = DynamicLoadDll.DynamicInvoke(dllPath, dllFunction, typeof(DllRegisterHandler), out msg);
if (o != null && (int)o >= 0)
{
Console.WriteLine(dllPath + " !");
}
else
{
Console.WriteLine(dllPath + " " + msg);
}
}
}
Console.Read();
}
}
위의 코드는 프로그램 디렉터리에 있는 ocx 파일을 가져와서 얻은 ocx 파일을 등록하는 것입니다. 주의해야 할 것은 컴파일할 때 Any CPU를 선택할 수 없고 x86을 선택해야 합니다. 그렇지 않으면 LoadLibrary가 성공하지 못할 것입니다!!이것은 경험으로 지나간 갱github 다운로드 주소입니다.https://github.com/lishuangquan1987/OneKeyRegister
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.