Наилучшее объяснение самой MS :
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
//This handler is called only when the common language runtime tries to bind to the assembly and fails.
//Retrieve the list of referenced assemblies in an array of AssemblyName.
Assembly MyAssembly, objExecutingAssembly;
string strTempAssmbPath = "";
objExecutingAssembly = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssembly.GetReferencedAssemblies();
//Loop through the array of referenced assembly names.
foreach(AssemblyName strAssmbName in arrReferencedAssmbNames)
{
//Check for the assembly names that have raised the "AssemblyResolve" event.
if(strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
{
//Build the path of the assembly from where it has to be loaded.
strTempAssmbPath = "C:\\Myassemblies\\" + args.Name.Substring(0,args.Name.IndexOf(","))+".dll";
break;
}
}
//Load the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
//Return the loaded assembly.
return MyAssembly;
}
Вот пример установки GtkFileFilter
с шаблоном *.cpp
для отображения только файлов C ++. Также устанавливается имя документа по умолчанию test.cpp
.
компиляция с помощью: g ++ filechooser.cpp `pkg-config --cflags gtk + -3.0`` pkg-config --libs gtk + -3.0`
#include <gtk/gtk.h>
static void dialog_result(GtkWidget *dialog, gint resp, gpointer data)
{
if (resp == GTK_RESPONSE_OK) {
// do nothing
} else {
gtk_widget_destroy(dialog);
}
}
static void open_dialog(GtkWidget *button, gpointer window)
{
GtkWidget *dialog;
GtkFileFilter *filter;
dialog = gtk_file_chooser_dialog_new("Choose a file:", GTK_WINDOW(window),
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE,
GTK_RESPONSE_OK, GTK_STOCK_CANCEL,
GTK_RESPONSE_CANCEL, NULL);
filter = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter, "*.cpp");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "test.cpp");
gtk_widget_show_all(dialog);
gint resp = gtk_dialog_run(GTK_DIALOG(dialog));
if (resp == GTK_RESPONSE_OK)
g_print("%s\n", gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
else
g_print("You pressed the cancel\n");
gtk_widget_destroy(dialog);
}
int main()
{
gtk_init(NULL, NULL);
GtkWidget *window, *button;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "delete_event", G_CALLBACK(gtk_main_quit), NULL);
button = gtk_button_new_with_label("Save");
g_signal_connect(button, "clicked", G_CALLBACK(open_dialog), window);
gtk_container_set_border_width(GTK_CONTAINER(window), 100);
gtk_container_add(GTK_CONTAINER(window), button);
gtk_widget_show_all(window);
gtk_main();
}
Вот завершенный код для собственного выбора файлов GTK, дополненный решением из jackw11111:
static void cb_SaveFileAs(GtkWidget *caller) // callback function
{
GtkWindow *parent_window = GTK_WINDOW(caller); // assuming that the caller is GtkWindow
GtkFileChooserNative *native;
GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
gint res;
native = gtk_file_chooser_native_new("Save File",
parent_window,
action,
"_Save",
"_Cancel");
// Filters
filter = gtk_file_filter_new(); // filter 1
gtk_file_filter_set_name(filter, "Project file");
gtk_file_filter_add_pattern(filter, ".proj");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter);
filter = gtk_file_filter_new(); // filter 2
gtk_file_filter_set_name(filter, "All files");
gtk_file_filter_add_pattern(filter, "*");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter);
// default file name
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(native), "my_file_name");
res = gtk_native_dialog_run(GTK_NATIVE_DIALOG(native));
if (res == GTK_RESPONSE_ACCEPT)
{
char *filename;
GtkFileChooser *chooser = GTK_FILE_CHOOSER(native);
filename = gtk_file_chooser_get_filename(chooser);
// save the file
save_to_file(filename);
g_free(filename);
}
g_object_unref(native);
}