我有一个C#项目(调用它MainProj)引用了其他几个DLL项目.通过将这些项目添加到MainProj引用中,它将构建它们并将其生成的DLL复制到MainProj的工作目录中.
我想做的是将这些引用的DLL放在MainProj工作目录的子目录中,即MainProj/bin/DLLs,而不是工作目录本身.
我不是一个非常有经验的C#程序员,但是来自C++世界,我假设一种方法是删除项目引用并通过路径和文件名显式加载所需的DLL(即在C++中LoadLibrary).然而,我更喜欢做的,如果有办法的话,就是设置某种"引用二进制路径",所以当我构建时它们都被自动复制到这个子目录中(然后从那里引用它们)我需要明确加载每个).这样的事情可能吗?
如果不是,那么C#中首选的方法是什么来实现我所追求的目标(即Assembly.Load/ Assembly.LoadFile/ Assembly.LoadFrom?某些东西AppDomain,或者System.Environment?)
我有一个用于编辑的窗口.编辑器应该加载一个dll(我完全控制它)以响应用户的选择,以了解如何直观地显示信息.(它们是dll,因为用户不一定想要或不需要每一个显示模型,并且还允许添加新的模型而不会弄乱主项目)
它们都将简单地存储在一个子目录中(现在无论如何)我很确定我可以枚举可用的dll但是我还需要做两件我不确定的事情.
1)从dll获取元数据的一些方法,所以我可以构建可能的显示选择列表......
2)加载选定的dll,并根据需要卸载它
任何建议将不胜感激.
有以下C#代码用于加载和卸载C++ DLL.
我只加载DLL一次,但代码必须卸载DLL 2次.在卸载DLL之后,当我再次加载它,并且我调用DLL的导出函数时,我收到以下错误消息:
尝试读取或写入受保护的内存.这通常表明其他内存已损坏.
DLL依赖于其他DLL.
/// //////////////handle of FDD DLL:
System.IntPtr SystemIntPtr_handle_of_DLL=System.IntPtr.Zero;
private void button4_Click(object sender, EventArgs e)
{
try
{
string string_Dependency_path = ".\\DLL_Dependencies\\";
Call_DLL.SetDllDirectory(string_Dependency_path);
SystemIntPtr_handle_of_DLL = Call_DLL.LoadLibrary("DLL.dll");
if (SystemIntPtr_handle_of_DLL == System.IntPtr.Zero) { throw new Exception("DLL did not load"); }
}
catch (Exception Exception_Object) { MessageBox.Show(Exception_Object.Message); }
}
private void button5_Click(object sender, EventArgs e)
{
try
{
int int_FreeLibrary_counter = 0;
while (Call_DLL.FreeLibrary(SystemIntPtr_handle_of_DLL))
{
int_FreeLibrary_counter++;
}
MessageBox.Show("DLL unloaded. You will have to load it again. (Unloaded" + int_FreeLibrary_counter …Run Code Online (Sandbox Code Playgroud)