由于动态程序集加载需要appdomain加载以启用使用卸载相关appdomain来终止程序集,是否在要加载的进程中有"最大"数量的appdomains?我在想一个基于服务器的应用程序,每个用户都可以动态运行他的专有C#代码.但是,如果2000用户登录并加载他们的代码怎么办?除了appdomians的数量之外,我可能遇到任何可能的限制吗?
谢谢.
当我将null指针传递给我时遇到崩溃dlclose.
我应该在打电话前检查空dlclose吗?
POSIX对此没有任何说明:http: //pubs.opengroup.org/onlinepubs/7908799/xsh/dlclose.html
它是未定义的行为还是dlclose实现中的错误?
linux posix shared-libraries dynamic-loading dynamic-library
我正在编写一个Java代理来与JVMTI进行交互.由于我不会涉及的原因,我需要使用JVMTI(java流程中的C接口)而不是Java API java.lang.instrument或JDI.我希望能够做一些似乎不能直接支持的事情.
dlclose()如果我能找到动态加载模块的句柄,我可以安全地从JVMTI代码调用吗?如果无法完成这些操作,是否有办法在加载后将数据传递给Java代理?有没有通过某些Java命令行实用程序执行此操作的常规方法?如果没有,我可以安全地创建一个线程并让它在我的代理的代码中使用标准的C或C++库调用来监听套接字吗?
如果它有帮助,不要担心用你的答案支持Windows - 我正在进行这个项目来扩展一个只有Unix的调试工具.
注意:我已经看过这个但是认为可能有一些正常的方法来做这个不在JVMTI标准中.
我的C#应用程序server.exe对我的业务运营至关重要,理想情况下需要24/7不间断地运行.代码是坚如磐石的,但是我无法控制的一件事是由第三方生成的入站数据源质量差.我偶尔会收到包含异常的数据Feed,在这种情况下我必须:
server.exe以适应异常server.exe使用新代码重新启动,并允许处理语法上有缺陷的feed整个过程通常需要不到几分钟,但重新启动server.exe会导致某些非关键状态信息的重置,更糟糕的是,会导致外部进程中断,这取决于server.exe.
我的目标:将Feed处理代码隔离到一个单独的DLL中,其内容可以在不重新启动的情况下进行更新server.exe. 我该怎么做呢?
请允许我解释一下我在撰写此论坛帖子之前所做的工作:
Feed进程处理器界面已移至名为的新程序集common.dll.界面看起来像这样:
public interface IFeedProcessor{
bool ProcessFeed(String filePath); //returns false on failure, true on success
}
Run Code Online (Sandbox Code Playgroud)
Server.exe现在参考common.dll.
Feed进程本身已被移动到一个名为的新程序集feedProcessors.dll.实现看起来像这样:
internal class FeedProcessor1:IFeedProcessor{
public FeedProcessor1(){}
bool ProcessFeed(String filePath){/*implementation*/return true;}
}
internal class FeedProcessor2:IFeedProcessor{
public FeedProcessor2(){}
public bool ProcessFeed(String filePath){/*implementation*/return true;}
}
[... and so on...]
Run Code Online (Sandbox Code Playgroud)
feedProcessors.dll还包含一个名为的类FeedProcessorUtils,用于根据某些配置输入创建特定的Feed处理程序.它看起来像这样:
public class FeedProcessorUtils{
public static void CreateFeedProcessor(int feedType …Run Code Online (Sandbox Code Playgroud) 我的iOS项目用于dlsym动态指向可选的C库。没有该项目的可选as-in可以随我们一起运行,它只是添加了功能。
有关背景信息:在运行时在Objective-C中检测并使用可选的外部C库
问题是,XCode清除了“未使用”的库。使用dlsym方法没有直接引用我的第三方库,XCode删除了它。
我以为自己在“其他链接器标记”中找到了解决方案,在
-force_load "$(SRCROOT)/my_external.a"模拟器中效果很好。(-all_load效果也不错,但对我来说似乎太过分了)。
问题是当我移至真实设备时,此解决方法失败,并且库未加载(与相同-all_load)。
唯一起作用的是在XCode中禁用名为的功能Dead Code Stripping。
问题是:禁用或建议我的客户禁用此功能真的不好吗?如果是这样,还有更好的选择吗?
我undefined symbol动态加载库时遇到错误.这是我生成此错误的代码段:
int main ()
{
void *lib_handle = NULL;
MyClass* (*create)();
void (*destroy)(MyClass*);
char *error;
lib_handle = dlopen ("./libshared.so", RTLD_LAZY);
if (lib_handle == NULL)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
create = (MyClass* (*)()) dlsym(lib_handle, "create_object");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}
destroy = (void (*)(MyClass*)) dlsym(lib_handle, "destroy_object");
MyClass *myClass = (MyClass*) create;
destroy(myClass);
dlclose(lib_handle);
}
Run Code Online (Sandbox Code Playgroud)
但是当我通过注释上面的代码并导出库路径来加载库时,一切都像魅力一样.
对于动态链接,我在命令提示符下使用以下命令.
g++ -Wl,--export-dynamic shared_user.cpp -ldl
任何帮助,将不胜感激.
我们正在为少数客户构建应用程序,每个客户都有自己的要求以及类似的要求.我们还希望将所有代码保存在同一个应用程序中,而不是将其分支,并且IF不是很好的选择,因为它将遍布所有地方.
我计划为所有人提供基础课程.然后每个客户都有自己的类,其中override方法将执行特殊逻辑.
我们如何在编译时加载程序集而不是这样做
public class BaseClass {
public string getEventId()
}
public class ClassForJohn:BaseClass {
[override]
public string getEventId()
}
public class ClassForAdam:BaseClass {
[override]
public string getEventId()
}
void UglyBranchingLogicSomewhere() {
BaseClass eventOject;
if("John"==ConfigurationManager.AppSettings["CustomerName"]){
eventOject = new ClassForJohn();
}else if("Adam"==ConfigurationManager.AppSettings["CustomerName"]){
eventOject = new ClassForAdam();
}else{
eventOject = new BaseClass ();
}
eventId = eventOject.getEventId();
}
Run Code Online (Sandbox Code Playgroud) 这一页检查并给出了如何动态加载和使用类的非常清晰的示例,但有一些我很难理解的内容:
我明白为什么需要“创建”功能,但为什么需要“销毁”功能?为什么没有将接口析构函数声明为纯虚拟函数?
我做了一个相同的例子,除了:
~polygon() = 0;
Run Code Online (Sandbox Code Playgroud)
的析构函数triangle是:
triangle::~triangle() {
std::cout << "triangle Dtor is called" <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
然后当我使用时:
delete poly;
Run Code Online (Sandbox Code Playgroud)
该消息确实显示(Linux 下的 GCC 5.4.0)。
我试图寻找其他示例,但它们都提到并使用“销毁”函数,没有使用简单的纯虚拟析构函数的示例,这使我相信我在这里遗漏了一些东西,所以..它是什么?
不想使用销毁函数的背景是我想在 a 中使用分配的对象shared_ptr并且以后不关心它的生命周期,使用“销毁”函数会很棘手,因此我需要知道是否有必要。
在JDBC中,我只看到使用的示例
Class.forName("com.mysql.jdbc.Driver", true, cl);
Run Code Online (Sandbox Code Playgroud)
并没有看到一个使用
import com.mysql.jdbc.Driver;
Run Code Online (Sandbox Code Playgroud)
是因为我们想在执行时动态提供驱动程序包,所以只能在执行时知道吗?
如果我们在执行之前已知有固定的驱动程序包,是否可以采用第二种方式?你会如何比较这两种方式?
谢谢.
从webpack文档中output.publicPath:
简单规则:HTML页面视图中的output.path的URL。
Run Code Online (Sandbox Code Playgroud)module.exports = { output: { path: path.resolve(__dirname, 'public/assets'), publicPath: 'https://cdn.example.com/assets/' } };
上面的规则对于单页应用程序是实际的,通常index.html与和index.js在同一文件夹中。但是,在多页网站的项目中,通常创建js或scripts创建特殊文件夹。因此,项目输出文件夹的文件结构可能类似于:
我尝试了很多的组合output.path output.publicPath和output.chunkFilename,但还是不明白,如何正确选择的上述参数进行动态负载的作品组合(例如const MODULE = import('./loadOnDemand/testModule')它chunks/chunk__0.js的输出文件夹中)。请告诉我有关如何选择output.path publicPath和的概念,该概念chunkFilename适用于以上文件系统,也可以在以下文件系统上缩放: